您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > Linux系统编程实验三:文件编程
实验三:文件编程实验目的:学会创建文件,并制定文件访问属性学会使用C库函数和Linux系统调用,并理解他们的区别实验要求:(一)编写应用程序,创建一可读可写的文件(二)使用库函数,实现文件copy的功能实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台实验步骤:(一)文件创建1、编写实验代码file_creat.c#includestdio.h#includestdlib.h#includesys/types.h#includesys/stat.h#includefcntl.hvoidcreate_file(char*filename){/*创建的文件具有可读可写的属性*/if(creat(filename,0666)0){printf(createfile%sfailure!\n,filename);exit(EXIT_FAILURE);}else{printf(createfile%ssuccess!\n,filename);}}intmain(intargc,char*argv[]){/*判断入参有没有传入文件名*/if(argc2){printf(youhaven'tinputthefilename,pleasetryagain!\n);exit(EXIT_FAILURE);}create_file(argv[1]);exit(EXIT_SUCCESS);}2、编译应用程序file_creat.c用gcc命令编译file_create.c后生成可执行文件file_creat3、运行应用程序运行了该程序后,大家可以发现在当前目录下产生了test.txt文件4、该实验让大家学习怎样用Linux的系统调用创建一个文件,并设置文件的访问属性,文件操作时Linux应用编程的基础(二)文件拷贝1、编写实验代码file_cp.c#includestring.h#includestrings.h#includestdio.h#includestdlib.h#defineBUFFER_SIZE1024intmain(intargc,char**argv){FILE*from_fd;FILE*to_fd;longfile_len=0;charbuffer[BUFFER_SIZE];char*ptr;/*判断入参*/if(argc!=3){printf(Usage:%sfromfiletofile\n,argv[0]);exit(1);}/*打开源文件*/if((from_fd=fopen(argv[1],rb))==NULL){printf(Open%sError\n,argv[1]);exit(1);}/*创建目的文件*/if((to_fd=fopen(argv[2],wb))==NULL){printf(Open%sError\n,argv[2]);exit(1);}/*测得文件大小*/fseek(from_fd,0L,SEEK_END);file_len=ftell(from_fd);fseek(from_fd,0L,SEEK_SET);printf(fromfilesizeis=%d\n,file_len);/*进行文件拷贝*/while(!feof(from_fd)){fread(buffer,BUFFER_SIZE,1,from_fd);if(BUFFER_SIZE=file_len){fwrite(buffer,file_len,1,to_fd);}else{fwrite(buffer,BUFFER_SIZE,1,to_fd);file_len=file_len-BUFFER_SIZE;}//写入完成后清空缓冲区memset(buffer,0,BUFFER_SIZE);}fclose(from_fd);fclose(to_fd);exit(0);}2、编译应用程序file_cp.c3、运行应用程序我们将file_cp.c拷贝为test.c,可以看到运行程序后文件夹出现了test.c和file_cp.c大小和内容都一样4、要注意区分C库函数和Linux系统调用对文件操作的方法。比如C库函数fread就没有像Linux系统调用read函数那样返回成功读取了多少个字节,只有清楚了他们之间的的区别我们才好熟练运用他们上机报告要求:编写一应用程序实现如下功能:使用open()函数创建一个名为file.txt,权限为666的文件;并向其中写入字符串“helloworld”,然后使用read()函数把写入的内容读取出来并在终端上显示输出。#includestdio.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestring.hintmain(){intfd=-1;fd=open(zhidao_561804018.dat,O_CREAT|O_TRUNC|O_RDWR,0666);if(fd0){perror(open);return-1;}charbuff[64];strcpy(buff,Hello!Iamwritingtothisfile!);intcount=strlen(buff);if(write(fd,buff,count)0){perror(write);return-1;}if(lseek(fd,0,SEEK_SET)0){perror(lseek);return-1;}if(read(fd,buff,10)0){perror(read);return-1;}buff[10]=0x00;printf(%s\n,buff);if(fd0){close(fd);fd=-1;}return0;}分别写出open(),read(),write(),close()函数的函数原型,功能,返回值,函数参数的意义。1.open()函数功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。所需头文件:#includesys/types.h,#includesys/stat.h,#includefcntl.h函数原型:intopen(constchar*pathname,intflags,intperms)参数:pathname:被打开的文件名(可包括路径名如dev/ttyS0)flags:文件打开方式,O_RDONLY:以只读方式打开文件O_WRONLY:以只写方式打开文件O_RDWR:以读写方式打开文件O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限O_EXCL:如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾O_NONBLOCK:如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。O_SYNC:使每次write都等到物理I/O操作完成。O_RSYNC:read等待所有写入同一区域的写操作完成后再进行在open()函数中,falgs参数可以通过“|”组合构成,但前3个标准常量(O_RDONLY,O_WRONLY,和O_RDWR)不能互相组合。perms:被打开文件的存取权限,可以用两种方法表示,可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH),其中R/W/X表示读写执行权限,USR/GRP/OTH分别表示文件的所有者/文件所属组/其他用户,如S_IRUUR|S_IWUUR|S_IXUUR,(-rex------),也可用八进制800表示同样的权限返回值:成功:返回文件描述符失败:返回-12.close()函数功能描述:用于关闭一个被打开的的文件所需头文件:#includeunistd.h函数原型:intclose(intfd)参数:fd文件描述符函数返回值:0成功,-1出错3.read()函数功能描述:从文件读取数据。所需头文件:#includeunistd.h函数原型:ssize_tread(intfd,void*buf,size_tcount);参数:fd:将要读取数据的文件描述词。buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。count:表示调用一次read操作,应该读多少数量的字符。返回值:返回所读取的字节数;0(读到EOF);-1(出错)。以下几种情况会导致读取到的字节数小于count:A.读取普通文件时,读到文件末尾还不够count字节。例如:如果文件只有30字节,而我们想读取100字节,那么实际读到的只有30字节,read函数返回30。此时再使用read函数作用于这个文件会导致read返回0。B.从终端设备(terminaldevice)读取时,一般情况下每次只能读取一行。C.从网络读取时,网络缓存可能导致读取的字节数小于count字节。D.读取pipe或者FIFO时,pipe或FIFO里的字节数可能小于count。E.从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。F.在读取了部分数据时被信号中断。读操作始于cfo。在成功返回之前,cfo增加,增量为实际读取到的字节数。4.write()函数功能描述:向文件写入数据。所需头文件:#includeunistd.h函数原型:ssize_twrite(intfd,void*buf,size_tcount);返回值:写入文件的字节数(成功);-1(出错)功能:write函数向filedes中写入count字节数据,数据来源为buf。返回值一般总是等于count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。对于普通文件,写操作始于cfo。如果打开文件时使用了O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo增加,增量为实际写入的字节数。实际自编:#includesys/stat.h#includesys/types.h#includefcntl.h#includeunistd.h#includestdio.h#includestring.hintmain(){intfdo,count,ws,rs;charbuf[]=helloworld!,buf2[10];count=sizeof(buf);fdo=open(file.txt,O_CREAT|O_TRUNC|O_RDWR,0666);if(fdo0){printf(openerror!);return-1;}ws=write(fdo,buf,count);if(ws0){printf(writeerror!);return-1;}printf(write:%s\n,buf);rs=read(fdo,buf2,ws);if(rs0){printf(readerror!);return-1;}printf(read:%s\n,buf2);close(fdo);return0;}
本文标题:Linux系统编程实验三:文件编程
链接地址:https://www.777doc.com/doc-4269709 .html