标准I/O缓冲:全缓冲、行缓冲、无缓冲

时间:2021-08-08 04:00:14

说明:我仅仅对网络资源进行了整合,方便学习~。~

基于流的操作终于会调用read或者write函数进行I/O操作。为了使程序的执行效率最高,流对象一般会提供缓冲区,以降低调用系统I/O库函数的次数。

基于流的I/O提供下面3种缓冲:

全缓冲:直到缓冲区被填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的I/O操作,将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区被填满,才进行实际的I/O操作,缓冲区内容写到外存文件里。磁盘文件一般是全缓冲的。

行缓冲:直到遇到换行符'/n',才调用系统I/O库函数。对于读操作来说,遇到换行符'/n'才进行I/O操作,将所读内容读入缓冲区;对于写操作来说,遇到换行符'/n'才进行I/O操作,将缓冲区内容写到外存中。因为缓冲区的大小是有限的,所以当缓冲区被填满时,即使没有遇到换行符'/n',也相同会进行实际的I/O操作。标准输入stdin和标准输出stdout默认都是行缓冲的。

无缓冲:没有缓冲区,数据会马上读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样保证错误提示和输出可以及时反馈给用户,供用户排除错误。

以上3种缓冲区分别定义为3个宏,其定义例如以下表所看到的。

缓冲区类型

定 义 的 宏

全缓冲

_IOFBF

行缓冲

_IOLBF

无缓冲

_IONBF

在使用上表所述的缓冲类型宏时,应将文件流对象中的缓冲区标志与该宏做"与"操作,推断结果是否为0就可以知道该缓冲文件流的缓冲区是否属于该类型了。

详细样例參考 http://hi.baidu.com/hp_roc/blog/item/47eedcef85e2b7dfb31cb19e.html

几个退出函数:

1、exit ()。调用exit函数之后,它首先会运行一系列的清理处理,包含调用运行各终止处理程序,关闭全部标准IO流等,然后进入内核。

2、_exit ()。与exit不同的是,它不进行清理工作而直接进入内核。此函数由POSIX.1说明,放在unistd.h里面。

3、_Exit ()。相同,它也不进行清理工作而直接进入内核。此函数跟exit一样由ISO C说明,放在stdlib.h里面。

对于退出函数对于缓冲区冲洗的效果以下这个链接讲的比較具体:

http://blog.csdn.net/seton040/archive/2009/08/31/4504825.aspx