setvbuf
在头文件<stdio.h>中定义 | ? | ? |
---|---|---|
int setvbuf(FILE * stream,char * buffer,int mode,size_t size); | ? | (直到C99) |
int setvbuf(FILE * restrict stream,char * restrict buffer,int mode,size_t size); | ? | (自C99以来) |
stream
如参数所示,更改给定文件流的缓冲模式mode
。此外,
- 如果
buffer
是空指针,则调整内部缓冲区的大小size
。 - 如果
buffer
不是空指针,则指示流使用用户提供的大小size
开始的缓冲区buffer
。流必须fclose
在数组生命周期buffer
结束之前关闭(with )。成功调用数组后的内容setvbuf
是不确定的,并且任何尝试使用它都是未定义的行为。
参数
流 | - | 用于设置缓冲区的文件流或空指针仅用于更改大小和模式 | ||||||
---|---|---|---|---|---|---|---|---|
缓冲 | - | 指向要使用的流的缓冲区 | ||||||
模式 | - | 缓冲模式使用。它可以是以下值之一:_IOFBF完全缓冲_IOLBF行缓冲_IONBF无缓冲 | _IOFBF | 完全缓冲 | _IOLBF | 行缓冲 | _IONBF | 没有缓冲 |
_IOFBF | 完全缓冲 | |||||||
_IOLBF | 行缓冲 | |||||||
_IONBF | 没有缓冲 | |||||||
size | - | 缓冲区的大小 |
返回值
?0?
失败时成功或非零。
注意
此功能可后方可使用stream
已经以开放的文件相关联,但任何其他操作之前(除了一个失败的呼叫setbuf
/ setvbuf
)。
并非所有size
字节都必须用于缓冲:实际的缓冲区大小通常被舍入为2的倍数,页面大小的倍数等。
在许多实现中,行缓冲仅适用于终端输入流。
一个常见的错误是将stdin或stdout的缓冲区设置为在程序终止之前其生命周期结束的数组:
int main(void) {
char buf[BUFSIZ];
setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
默认缓冲区大小BUFSIZ
预计是实现上文件I / O的最有效缓冲区大小,但POSIX fstat通常会提供更好的估计。
例
改变缓冲区大小的一个用例是知道更好的大小。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void)
{
FILE* fp = fopen("test.txt", "r");
if(fp == NULL) {
perror("fopen"); return 1;
}
struct stat stats;
if(fstat(fileno(fp), &stats) == -1) { // POSIX only
perror("fstat"); return 1;
}
printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize);
if(setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) {
perror("setvbuf failed"); // POSIX version sets errno
return 1;
}
int ch;
while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
// observe the read(2) syscalls used
fclose(fp);
}
可能的输出:
BUFSIZ is 8192, but optimal block size is 65536
参考
- C11标准(ISO / IEC 9899:2011):
- 7.21.5.6 setvbuf函数(p:308)
- C99标准(ISO / IEC 9899:1999):
- 7.19.5.6 setvbuf函数(p:273-274)
- C89 / C90标准(ISO / IEC 9899:1990):
- 4.9.5.6 setvbuf函数
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com