C语言-Stream buffering 操作 (setbuf,setbuffer,setlinebuf,setvbuf)

接口:

#include 
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值。除了这个函数,其他的三个函数不返回任何值。

转载于:https://my.oschina.net/u/2501393/blog/524386

你可能感兴趣的:(C语言-Stream buffering 操作 (setbuf,setbuffer,setlinebuf,setvbuf))