引言
回顾一下之前的系统IO,系统IO与标准IO都是我们操作文件的接口。而标准IO比系统IO的功能更加丰富,因为其功能是由标准库提供的。并且最重要的是,标准IO是带有缓冲的,就能够提高程序的吞吐量。
标准IO的特点
- 标准IO的操作对象是文件指针
- 标准IO由标准库提供,因此功能更加丰富。
- 标准IO带有缓冲,能够提高程序的吞吐量,尤其是在处理大量数据的情况下,尤为出色。
文件指针与文件描述符的关系
在系统IO中有一个特别重要的就是文件描述符,而标准IO则有文件指针,那么它们的关系是:
- 我前面笔记有记载过系统IO的文件描述符的原理,就是上图的红色区域,也就是系统IO的工作原理。
- 而标准IO是上图蓝色部分。区别就是,在用户空间不仅包含了文件描述符,还包含了很多指针。那么文件指针fp会把数据全部放到缓冲区,那么会在特定的时间,再去给内核空间输送数据。
- 标准IO相对于系统IO频繁使用内核空间的低效率行为的好处是:如果遇到大量数据的情况下,标准IO会起缓冲的功能,那么在某条件成立的情况下,把所有数据输送到内核,然后再同步到文件中。
- 文件指针fp并不是指向文件的指针,从上图可以看到,文件指针只是指向代表管理文件的FILE{}结构体。
fopen()函数的使用
值得注意的是:使用函数不能想当然,要看着手册使用:
列表 A | 列表B |
---|---|
功能 | 获取指定文件的文件指针 |
头文件 | #include <stdio.h> |
原型 | FILE *fopen(const char * path ,const char *mode); |
参数 | path:将要打开的文件 |
参数mode | "r" : 以只读方式打开文件,要求文件必须存在 |
参数mode | “r+":以读写方式打开文件,要求文件必须存在 |
参数mode | ”w":以只写方式打开文件,文件如果不存在将会自动创建新文件,如果存在将会将其内容清空 |
参数mode | "w+“:以读写方式打开文件,文件如果不存在将会创建新文件,如果存在将会将其内容清空 |
参数mode | "a":以只写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量被自动定位到文件末尾(即以追加方式写数据) |
参数mode | ”a+“:以读写的方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量被自动定位到文件末尾(即以追加方式写数据) |
返回值 | 成功:文件指针 |
返回值 | 失败:NULL |