BUGS

您必须确保在关闭流时buf指向的空间仍然存在,这也将在程序终止时发生。例如,以下无效:

#include <stdio.h>

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

说明

可用的三种缓冲类型是非缓冲,块缓冲和行缓冲。当输出流未缓冲时,信息将在写入后立即出现在目标文件或终端上。当它被块缓冲时,许多字符被保存起来并写成一个块;当是行缓冲字符时,将保存这些字符,直到从连接到终端设备的任何流(通常是stdin)输出换行符或读取换行符为止。 fflush(3)函数可用于强制将块提前退出。 (请参阅fclose(3)。)

通常,所有文件都是块缓冲的。如果流指向终端(如stdout通常所做的那样),则会对其进行行缓冲。默认情况下,标准错误流stderr始终未缓冲。

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

_IONBF
无缓冲
_IOLBF
行缓冲
_IOFBF
完全缓冲

除了未缓冲的文件外,buf参数应指向至少大小为字节长的缓冲区。将使用此缓冲区代替当前缓冲区。如果参数buf为NULL,则仅影响模式。在下一次读或写操作时将分配一个新的缓冲区。 setvbuf()函数只能在打开流之后且对该流执行任何其他操作之前使用。

实际上,其他三个调用只是对setvbuf()的调用的别名。 setbuf()函数与调用完全等效

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

setbuffer()函数是相同的,只是缓冲区的大小取决于调用者,而不是由默认的BUFSIZ确定。 setlinebuf()函数与调用完全等效:

setvbuf(stream,NULL,_IOLBF,0);

遵循规范

setbuf()和setvbuf()函数符合C89和C99。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
setbuf(),setbuffer(),
setlinebuf(),setvbuf()
Thread safetyMT-Safe

另外参见

stdbuf(1),fclose(3),fflush(3),fopen(3),fread(3),malloc(3),printf(3),puts(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

SETBUF - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-03-06

返回值

函数setvbuf()成功返回0。失败时返回非零值(模式无效或无法接受请求)。它可能在失败时设置errno。

其他函数不返回值。

名称

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():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE

日期:2019-08-20 18:01:15 来源:oir作者:oir