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!\n");
  return 0;
}

备注:感觉标准输入流有点迷,setvbuf的时候设置的缓存区有效,但是设置的缓存方式完全被无视了的节奏呀。

转载于:https://www.cnblogs.com/lthb/p/6598415.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值