标准io是另一套io接口,但底层还是依赖于文件io,优点就是自带缓冲区以及效率更快,而且标准io是跨平台的,文件io操作只能在linux进行。

数据流

先说一下流的概念,其实就是连续数据的集合。
一般流可以分为 文本流 与 二进制流

文件指针

在一个文件打开时,会在内存中开辟一块区域作为对文件信息的描述,这个描述保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。


在标准io中,提前预定义了三个流指针,在应用程序运行自动被打开.
分别是:
stdin对应的是标准输入设备
stdout对应的是标准输出设备
stderr对应的是标准错误输出设备
上面对应的文件描述符分别为0,1,2。


我们常用的printf函数其实是默认为stdout为流对象。如果我们想改变的话需要用到fprintf函数:


1
int fprintf(FILE *stream, const char *format, …);

比如我想在屏幕上输出一个hello linux。那我只需要:

fprintf(stdout,"hello linux");

上面这句话如果在单语句执行的时候是没有什么问题的,但是假如我在fprintf下面加上一个死循环,比如:

1
2
fprintf(stdout,"hello linux");
while(1){}

那么就输出不了这句话,这就涉及到缓存了:


上面说过标准io自带缓存区,分为三类:
1.全缓存:等缓存区的数据占满以后再进行系统调用
2.行缓存:等缓存区的数据占满一行后进入io操作(stdout就是行缓存)
3.不缓存:来什么数据我就进行io操作(stderr就是不缓存,以免错误堆积)
所以上面的数据默认fprintf的数据没有占满一行,程序也没有结束,不输出,如果要输出的话有三种办法:
1.后面加一个 \n
2.用fflush强制刷新缓存
3.把流对象换成stderr


一般情况下,程序在结束时会 自动刷新缓冲区,但是当程序还未结束时,刷新缓冲区则需要调用 fflush() 函数

1
int fflush(FILE *stream);