接口:
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream)
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
描述:
系统中有三种可用的buffer类型,分别为无Buffer(Unbuffered),块Buffer(Block Bufferd)和行Buffer(Line Buffered)。当一个流是Unbufferd的时候,往这个Stream中写入的信息会立刻写入目标文件。当Buffer类型是Block Buffered时,往该Stream中写入的信息会先暂存在Buffer中,每次实际的写入都是以块(Block)大小为单位写入目标文件。而当Buffer类型是Line Buffered时,往该Stream中输入的信息都会先暂存在Buffer中直到遇到新的一行,或是从一个终端设备读入例如stdin。fflush()可以强制将Buffer提前清空。
通常所有的文件和设备都是Block Buffered,如果任何一个流涉及到终端(例如stdin)那它将是Line Buffer类型。而标准错误流stderr的默认Buffer类型永远是Unbuffered类型。
setvbuf()函数或许可以使用在任何打开的Stream中用于改变它的Buffer类型。该函数的参数mode可以是一下三个宏(macros)之一:
_IONBF Unbuffered
_IOLBF Line Buffered
_IOFBF Fully Buffered
除了将mode设置成_IONBF,参数buf应当指定一个长度不小于size Byte的buffer。这个指定的buffer将用来代替当前的buffer。如果将buf设为NULL只有将mode设为_IONBF才有效。一个新的buffer应当在下一次读写操作之前分配好。setvbuf()函数可能只有在打开一个stream之后,在所有操作之前有效。
其他的三个函数与setvbuf()都比较相似,setbuf()函数实际上等价于下面的调用:
setvbuf(stream, buf, buf?_IOFBF:_IONBF,BUFSIZ);
serbuffer()函数也是一样,除了buffer的长度size是由参数传入的而不是使用默认的BUFSIZ。setlinebuf()实际上则等价于下面的调用:
setvbuf(stream, NULL, _IOLBF, 0);
setvbuf()函数返回0表示成功,非0值表示失败(mode是无效的或是请求不能被实现)。如果失败该函数将设置errno值。除了这个函数,其他的三个函数不返回任何值。