Linux系统编程实验三:文件编程.doc_第1页
Linux系统编程实验三:文件编程.doc_第2页
Linux系统编程实验三:文件编程.doc_第3页
Linux系统编程实验三:文件编程.doc_第4页
Linux系统编程实验三:文件编程.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三:文件编程l 实验目的:学会创建文件,并制定文件访问属性学会使用C库函数和Linux系统调用,并理解他们的区别l 实验要求:(一)编写应用程序,创建一可读可写的文件(二)使用库函数,实现文件copy的功能l 实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台l 实验步骤:(一)文件创建1、编写实验代码file_creat.c#include #include #include #include #include void create_file(char *filename) /*创建的文件具有可读可写的属性*/ if(creat(filename,0666)0) printf(create file %s failure!n,filename); exit(EXIT_FAILURE); else printf(create file %s success!n,filename); int main(int argc,char *argv) /*判断入参有没有传入文件名 */ if(argc2) printf(you havent input the filename,please try again!n); exit(EXIT_FAILURE); create_file(argv1); exit(EXIT_SUCCESS); 2、编译应用程序file_creat.c用gcc命令编译file_create.c后生成可执行文件file_creat3、运行应用程序运行了该程序后,大家可以发现在当前目录下产生了test.txt文件4、该实验让大家学习怎样用Linux的系统调用创建一个文件,并设置文件的访问属性,文件操作时Linux应用编程的基础(二)文件拷贝1、编写实验代码file_cp.c#include #include #include #include #define BUFFER_SIZE 1024 int main(int argc,char *argv) FILE *from_fd;FILE *to_fd; long file_len=0;char bufferBUFFER_SIZE; char *ptr; /*判断入参*/if(argc!=3) printf(Usage:%s fromfile tofilen,argv0); exit(1); /* 打开源文件 */ if(from_fd=fopen(argv1,rb)=NULL) printf(Open %s Errorn,argv1); exit(1); /* 创建目的文件 */ if(to_fd=fopen(argv2,wb)=NULL) printf(Open %s Errorn,argv2); exit(1); /*测得文件大小*/fseek(from_fd,0L,SEEK_END);file_len=ftell(from_fd);fseek(from_fd,0L,SEEK_SET);printf(from file size is=%dn,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函数那样返回成功读取了多少个字节,只有清楚了他们之间的的区别我们才好熟练运用他们l 上机报告要求:编写一应用程序实现如下功能:使用open()函数创建一个名为file.txt,权限为666的文件;并向其中写入字符串“hello world”,然后使用read()函数把写入的内容读取出来并在终端上显示输出。#include#include#include#include#include#includeintmain()intfd=-1;fd=open(zhidao_561804018.dat,O_CREAT|O_TRUNC|O_RDWR,0666);if(fd0)perror(open);return-1;charbuff64;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)close(fd);fd=-1;return0;分别写出open(),read(),write(),close()函数的函数原型,功能,返回值,函数参数的意义。1. open()函数功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。所需头文件:#include ,#include ,#include 函数原型:int open(const char *pathname,int flags,int perms)参数: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()函数功能描述:用于关闭一个被打开的的文件所需头文件:#include 函数原型:int close(int fd)参数:fd文件描述符函数返回值:0成功,-1出错3. read()函数功能描述: 从文件读取数据。所需头文件:#include 函数原型:ssize_tread(int fd, void *buf, size_t count);参数:fd:将要读取数据的文件描述词。buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。count: 表示调用一次read操作,应该读多少数量的字符。返回值:返回所读取的字节数;0(读到EOF);-1(出错)。以下几种情况会导致读取到的字节数小于count :A. 读取普通文件时,读到文件末尾还不够count 字节。例如:如果文件只有 30 字节,而我们想读取 100字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。C. 从网络读取时,网络缓存可能导致读取的字节数小于 count字节。D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于count 。E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。F. 在读取了部分数据时被信号中断。读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。4. write()函数功能描述: 向文件写入数据。所需头文件:#include 函数原型:ssize_t write(int fd, void *buf, size_t count);返回值:写入文件的字节数(成功);-1(出错)功能:write 函数向 filedes 中写入count 字节数据,数据来源为 buf 。返回值一般总是等于 count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。实际自编:#include#include#include#include#include#includeint main()int fdo,count,ws,rs;char buf=hello world!,buf210;count=sizeof(buf);fdo=open(file.txt,O_CREAT|O_TRUNC|O_RDWR,066

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论