linux标准io

标准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);