名称:
setbuf, setbuffer, setlinebuf, setvbuf - stream buffering operations
头文件及函数形式:
#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);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
setbuffer(), setlinebuf(): _BSD_SOURCE
描述:
有三种不同的缓存类型:unbuffered,block buffered,line buffered。如果一个输出流是unbuffered的,那么信息会在写的同时立即显示在输出文件上(包括文件和终端);如果是block buffered那么在写的时候很多字符将会存储起来并在缓存区写满或者调用fflush的时候一次性写出到文件;如果是line buffered那么字符将会存储起来知道出现换行符才会一次性写入到文件(当然,如果迟迟没有换行符直到缓存区写满也会写入到文件)(感觉最后一句翻译的不好,原文如下:when it is line
buffered characters are saved up until a newline is output or input is read from any stream attached to a terminal device(typically stdin))。
正常情况下所有的文件都是block buffered。但是如果一个流指向一个终端(通常是stdout),那么它会是line buffered。标准错误流则总是默认为unbuffered的。
setvbuf()函数通常用来改变一个打开的流的缓存。mode参数必须被指定为下面三个宏之一:
_IONBF unbuffered
_IOLBF line buffered
_IOFBF fully buffered(block buffered)
除了unbuffered文件,buf参数应该指向一个至少有size字节的缓存区(也就是一个内存)。如果buf参数为NULL,只有缓存模式被影响;一个新的缓存区将在下一个读或写的时候被分配。setvbuf函数通常在打开一个流之后对这个流执行任何操作之前使用。
其他三个函数调用实际上就是setvbuf的别名。
setbuf()等价于setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
setbuffer()和setbuf()完全相同,除了它自己指定缓存区的大小而不是使用默认的BUFSIZ。
setlinebuf()等价于setvbuf(stream, NULL, _IOLBF, 0);
返回值:
setbuf()函数调用成功返回0,调用失败返回非0(mode不合法或者请求不能兑现)。它会在失败的时候设置errno。
BUGS:
你必须保证buf指向的空间在流关闭的时候仍然存在,对于程序终端(标准输入输出流)也有这个要求。比如下面的这个例子是不合法的:
#include <stdio.h>
int
main(void)
{
char buf[BUFSIZ];
setbuf(stdin, buf);
printf("Hello, world!
");
return 0;
}
备注:感觉标准输入流有点迷,setvbuf的时候设置的缓存区有效,但是设置的缓存方式完全被无视了的节奏呀。