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

来源:互联网 发布:康倩雯 知乎 编辑:程序博客网 时间:2024/05/19 09:01

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>intmain(void){    char buf[BUFSIZ];    setbuf(stdin, buf);    printf("Hello, world!\n");    return 0;}

 

原创粉丝点击