setbuf, setbuffer, setlinebuf, setvbuf - 流缓冲操作

265 篇文章 0 订阅

http://cpp.ezbty.org/import_doc/linux_manpage/setvbuf.3.html

SETBUF

章节:Linux 程序员手册 (3)
更新:2008-06-26

易美翻译 翻译 本页


 

名字

setbuf, setbuffer, setlinebuf, setvbuf - 流缓存区操作

概要

#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);

glibc 需要特性测试宏(参看 feature_test_macros(7)):

setbuffer(), setlinebuf():_BSD_SOURCE

描述

有三种缓存类型存在,不缓存,块缓存,和行缓存。当一个输出流是不缓存的,信息将在写入的同时在目标文件或终端显示;当它是块缓存,多个字符被缓存然后作为整体一块写入;当是行缓存,对输出流而言所有的数据都会被缓存直到遇到一个换行符,或者对于一个绑定到终端设置的输入流(典型地 stdin)所有数据也会缓存直到读到一个换行符。首次对文件进行 I/O 操作时,malloc(3) 被调用,并用于获得一个缓存区。如果一个流引用一个终端(就像 stdout 通常那样),则它是行缓存的。标准错误流 stderr 总是默认不缓存的。

setvbuf() 函数可能用于任何已经打开的流以更改它的缓存区。mode 参数必须是下面三个宏之一:

_IONBF
不缓存
_IOLBF
行缓存
_IOFBF
全缓存

除了是不存在的文件外,buf 参考应该指向一个至少有 size 个字节长度的缓存区;这个缓存将代替当前的缓存区。如果参数 buf 是 NULL,只要模式支持;一个新缓存区将用于下次读写操作。setvbuf() 函数只应该在刚打开一个流之后和执行任何其它操作之前使用。

其它三个调用,在功能上,只是 setvbuf() 调用的一个别名。setbuf() 函数事实上等价于调用

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

setbuffer() 函数也是相同的,只不过缓存区的大小是调用者提供的,而不是通过 BUFSIZ 来检测的。setlinebuf() 函数事实上等价于调用:

setvbuf(stream, (char *) NULL, _IOLBF, 0);

返回值

函数 setvbuf() 成功时返回 0。失败时它返回非零值(mode 无效或请求无法完成)。在失败时它设置 errno

其它函数没有返回值。

遵循于

setbuf() 和 setvbuf() 函数遵循于 C89 和 C99。

错误

setbuffer() 和 setlinebuf() 函数不能移植到 BSD 版本在 4.2BSD 之前,同时在 Linux 下它们从 libc 4.5.21 开始有效。在 4.2BSD 和 4.3BSD 系统里,setbuf() 使用一个不理想的缓存区尺寸并应该避免。

你必须保证 buf 指定的空间一直到 stream 关闭时都有效,这包括在退出时也一样。例如,下面的代码是无效的:

#include <stdio.h>

int
main(void)
{
    char buf[BUFSIZ];
    setbuf(stdin, buf);
    printf("Hello, world!\n");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值