加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

【Linux】系统编程之文件(标准I/O库)

发布时间:2022-11-16 18:31:55 所属栏目:Unix 来源:网络
导读: 目录
一、文件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

函数原型:

#include 
FILE *fopen(const char *pathname, const char *mode);

参数介绍:

pathname:包含要打开的文件路径及文件名(含路径,缺省为当前路径);

mode:文件打开状态;

mode 打开模式:

文件使用方式含义

r

只读方式打开一个文本文件

rb

只读方式打开一个二进制文件

w

只写方式打开一个文本文件

wb

只写方式打开一个二进制文件

a

追加方式打开一个文本文件

ab

追加方式打开一个二进制文件

r+

可读可写方式打开一个文本文件

rb+

可读可写方式打开一个二进制文件

w+

可读可写方式创建一个文本文件

wb+

可读可写方式生成一个二进制文件

a+

可读可写追加方式打开一个文本文件

ab+

可读可写方式追加一个二进制文件

返回值:

若成功,返回指向FILE的指针(文件指针)

若出错,返回NULL

2、函数fwrite

函数原型:

#include 
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

参数介绍: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

函数原型:

#include 
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数介绍: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

函数原型:

#include 
int fseek(FILE *stream, long offset, int whence);

参数介绍:

stream:要操作的文件流(哪个文件)

offset:偏移量

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!