SETBUF - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-03-06
名称
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
说明
可用的三种缓冲类型是非缓冲,块缓冲和行缓冲。当输出流未缓冲时,信息将在写入后立即出现在目标文件或终端上。当它被块缓冲时,许多字符被保存起来并写成一个块;当是行缓冲字符时,将保存这些字符,直到从连接到终端设备的任何流(通常是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);
返回值
函数setvbuf()成功返回0。失败时返回非零值(模式无效或无法接受请求)。它可能在失败时设置errno。
其他函数不返回值。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
setbuf(),setbuffer(), setlinebuf(),setvbuf() | Thread safety | MT-Safe |
遵循规范
setbuf()和setvbuf()函数符合C89和C99。
BUGS
您必须确保在关闭流时buf指向的空间仍然存在,这也将在程序终止时发生。例如,以下无效:
#include <stdio.h> int main(void) { char buf[BUFSIZ]; setbuf(stdin, buf); printf("Hello, world!\n"); return 0; }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。