1.标准I/O的缓冲有三种类型:
(1)全缓冲:缓冲区被填满后进行I/O操作
(2)行缓冲:输入和输出中遇到换行符,执行I/O操作。
行缓冲的两个限制: 如果缓冲区被填满,即使没有换行符,也进行I/O操作。
标准I/O库要求从一个不带缓冲的流,或者一个行缓冲的流(它从内核请求输入数据)得到输入数据,将冲洗所有行缓冲输出流。
(3)无缓冲:不进行缓冲存储
2.关于冲洗(flush):
从标准I/O的角度,flush是将缓冲区的内容写到磁盘
从终端驱动程序的角度,flush是丢弃缓冲区中的数据
函数:int fflush(FILE *fp); 用于强制flush一个流
3.系统默认的缓冲方式:
标准输入、输出连至终端时,为行缓冲;
如果将标准输入,输入重定向到普通文件时,变为全缓冲;
标准错误:不带缓冲
普通文件:全缓冲
4.改变缓冲类型的函数:
#include <stdio.h>
void setbuf(FILE *fp, char *buf ) ; //如果buf为NULL,关闭缓冲;如果buf指向长度为BUFSIZE的缓冲区,通常该流设置为全 缓冲,如果该留与一个终端设备相关,某些系统也可将其设置为行缓冲
int setvbuf(FILE *fp, char *buf, int mode, size_t size) ;
mode参数说明:_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲,此时忽略buf, size参数
如果为行缓冲或全缓冲,buf和size用来设置缓冲区及其长度;如果设为带缓冲,而buf为NULL,则系统自动分配缓冲区,长度为BUFSIZE