关于标准IO流的一些认识

来源:互联网 发布:蒙古天骄吧 知乎 编辑:程序博客网 时间:2024/05/03 19:46

C语言库中有一个FILE的结构体,当我们打开一个文件的时候,会用到FILE*类型的指针来操作fopen所返回的一个指针,这个指针就是流。

流是操作系统管理IO的一个引入的概念,一个流是与一个描述符绑定在一起的。所以也可以根据流来得到一个描述符。

标准IO库有三种类型的缓冲:1、全缓冲2、行缓冲3、无缓冲。全缓冲是指,当一个操作一个流的时候,如果打算往流里写进去一些信息,那么如果这是全缓冲的流,它会先把信息写在它的缓冲里面,直到信息结束满或者缓冲区空间已满的时候,才会触发IO写操作。

例如,当我们需要往一个stdout标准输出写入一些信息的时候,那么全缓冲的stdout会把你想写的信息先缓存在它的缓冲区里面,这样的话,只有等你把要写的信息写完整了、或缓冲区空间不够用了的情况下,操作系统才会为我们执行真正的IO写操作。也就是才会把信息给写到输出,而并不是你写一个字符的信息,操作系统就帮我们执行一个IO的写操作,这样的话明显浪费资源。反之,stdin也是一样。

接着是一个行缓冲,跟全缓冲差不多的概念,但是这个行缓冲会在stdout遇到一个'/n'即回车符号的时候,就执行写操作。

无缓冲,stdout收到一个字符写一个字符,不过实际上很少情况下会真正这样做,因为还受到一个硬件的限制,有的硬件会有缓存的操作,这个是程序级别难以控制的。

fgets这个函数每次只能获得一行的信息。而一般在交互的设备中,stdin跟stdout默认是全缓冲的。stderr是无缓冲的流、