【Linux】系统编程之文件(标准I/O库)
一、文件I/O与标准I/O的区别(open与fopen) 1、来源
从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:
PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语言的库函数
目录 一、文件I/O与标准I/O的区别(open与fopen) 1、来源 从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别: PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语言的库函数还是需要调用系统API实现的。 2、移植性 这一点从上面的来源就可以推断出来,fopen是C标准函数,因此拥有良好的移植性;而open是UNIX系统调用,移植性有限。如windows下相似的功能使用API函数CreateFile。 3、适用范围 4、文件IO层次 如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。 5、缓冲 1、缓冲文件系统 缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用;当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等。 2、非缓冲文件系统 缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据unix系统结构,也可以读写二进制数据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open, close, read, write, getc, getchar, putc, putchar等。 两种I/O模型的比较 I/O模型文件I/O标准I/O 缓冲方式 非缓冲I/O 缓冲I/O 操作对象 文件描述符fd 流FILE 打开 open() fopen() 读 read() fread()/fgetc()/fgets() 写 write() fwrite()/fputc()/fputs() 定位 lseek() fseek() 关闭 close() fclose() 一句话总结一下,就是open无缓冲,fopen有缓冲。前者与read, write等配合使用, 后者与fread,fwrite等配合使用。 使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用API:read,write);而使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列的函数快;如果随机访问文件则相反。 二、函数fopen、fwrite、fread、fseek、fclose 前提知识 文件指针实际上是指向一个结构体类型的指针,这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”还是“写”、是否出错、是否已经遇到文件结束标志等信息。用户不必去了解其中的细节,所有一切都在 stdio.h 头文件中进行了定义。一般称上面提到的结构体类型名为 FILE,定义文件类型指针变量的一般形式为: FILE *指针变量名; 例如:FILE *fp1, *fp2; fp1 和 fp2 均被定义为指向文件类型的指针变量,称为文件指针。 1、函数fopen 函数原型:
参数介绍: pathname:包含要打开的文件路径及文件名(含路径,缺省为当前路径); mode:文件打开状态; mode 打开模式: 文件使用方式含义 r 只读方式打开一个文本文件 rb 只读方式打开一个二进制文件 w 只写方式打开一个文本文件 wb 只写方式打开一个二进制文件 a 追加方式打开一个文本文件 ab 追加方式打开一个二进制文件 r+ 可读可写方式打开一个文本文件 rb+ 可读可写方式打开一个二进制文件 w+ 可读可写方式创建一个文本文件 wb+ 可读可写方式生成一个二进制文件 a+ 可读可写追加方式打开一个文本文件 ab+ 可读可写方式追加一个二进制文件 返回值: 若成功,返回指向FILE的指针(文件指针) 若出错,返回NULL 2、函数fwrite 函数原型:
参数介绍:char *str = "Apibro is very nice!"; ptr:存放写入记录的缓冲区(相当于buf缓冲区) size:写入的记录大小(要写多少字节数),即sizeof(char) nmemb:写入的记录数(要写多少个数据项,每个数据项长度为size),即strlen(str) stream:要写入的文件流(哪个文件) 返回值: 若成功,返回实际写入的nmemb数目(size_t nmemb为一个整型数,即写入的次数) 若出错,EOF(End of File) 3、函数fread 函数原型:
参数介绍:char *str = "Apibro is very nice!"; ptr:存放读入记录的缓冲区(相当于buf缓冲区) size:读取的记录大小(要读多少字节数),即sizeof(char) nmemb:读取的记录数(要读多少个数据项,每个数据项长度为size),即strlen(str) stream:要读取的文件流(哪个文件) 返回值: 若成功,返回实际读取的nmemb数目(size_t nmemb为一个整型数,即读取的次数) 若出错,EOF(End of File),即-1 4、函数fseek 函数原型:
参数介绍: stream:要操作的文件流(哪个文件) offset:偏移量 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |