Linux标准I/O与文件IO
一.标准IO
1.定义
标准I/O指的是ANSI C中定义的用于I/O操作的一系列函数。只要操作系统安装了C库,就可以调用标准I/O。换句话说,若程序使用标准I/O函数,那么源代码无需进行任何修改就可以在其他操作系统上编译,具有更好的可移植性。I/O封装了缓冲区,使得在读写文件的时候减少了系统调用的次数,提高了效率。在执行系统调用的时候,Linux必须从用户态切换到内核态,在内核中处理相应的请求,然后再返回用户态。如果频繁地执行系统调用则会增加这种开销。标准I/O为了减少这种开销,采取缓冲机制,为用户空间创建缓冲区,读写时优先操作缓冲区,在必须访问文件时(例如缓冲区满、强制刷新、文件读写结束等情况)再通过系统调用将缓冲区的数据读写实际文件中,从而避免了系统调用的次数。
2、文件流指针(FILE*)的定义
标准I/O的核心对象是文件流。当用标准I/O打开一个文件时,就会创建一个FILE指针指向结构体描述该文件。我们把这个FILE*称为文件流指针。标准I/O函数都是基于流进行各种操作的。
3.文件流指针和文件的关系
可以想象成一个传送带,传送带上的产品就是待操作数据。当我们对文件内的数据进行操作时,已操作的数据从当前位置离开,待操作的数据不断流向当前位置,这样文件内的数据就产生了流动的感觉,这个“传送带”就是C语言内“流”的原型。在程序开始执行的时候,操作系统会默认开启stdin、stdout、stderr三个文件,这三个文件作为输入、输出、输出错误的流。
4.标准IO编程
1.fopen函数
需要头文件:#include<stdio.h>
函数原型:FILE *fopen(const char *path,const char *mode)
函数参数:path:要打开的文件的路径及文件名
mode:
r:以读方式打开,如果当前打开的文件不存在,则报错
r+:以读写方式打开,如果当前打开的文件不存在,则报错
w:以写方式打开,如果文件不存在,则创建。如果当前文件存在,则将当前文件截断,文件留置针指向文件头部
w+:以读写方式打开,如果文件不存在,则创建。如果当前文件存在,则将当前文件截断,文件留置针指向文件头部
a:以追加方式打开,如果文件不存在则创建
a+:以追加方式打开,如果文件不存在则创建,当前a+是支持读的
函数返回值:成功:指向文件的FILE类型指针
2.fread函数 和 fwrite函数
3
需要头文件:#include<stdio.h>
函数原型:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
函数