setbuf手册

名称:

  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的时候设置的缓存区有效,但是设置的缓存方式完全被无视了的节奏呀。