setbuf
来自 zh.cppreference.net
| 定义于头文件 <stdio.h>
|
||
void setbuf( FILE* stream, char* buffer );
|
(直到C99) | |
void setbuf( FILE* restrict stream, char* restrict buffer );
|
(自C99) | |
#define BUFSIZ /* unspecified */
|
||
设置用于流操作的内部缓冲区。其长度应至少为 BUFSIZ 个字符。
若 buffer 非空,则等价于 setvbuf(stream, buffer, _IOFBF, BUFSIZ)。
若 buffer 为空,则等价于 setvbuf(stream, NULL, _IONBF, 0),这将关闭缓冲。
参数
| stream | - | 要设置缓冲区的文件流 |
| buffer | - | 指向流使用的缓冲区的指针。若提供空指针,则关闭缓冲 |
注释
若 BUFSIZ 不是合适的缓冲区大小,可使用 setvbuf 更改它。
setvbuf 也应被用于检测错误,因为 setbuf 不指示成功或失败。
此函数仅在 stream 与一个打开的文件关联之后,但在任何其他操作(除了对 setbuf/setvbuf 的失败调用)之前使用。
常见错误是将 stdin 或 stdout 的缓冲区设置为一个生命周期在程序结束前结束的数组:
int main(void)
{
char buf[BUFSIZ];
setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
示例
setbuf 可用于禁用需要立即输出的流的缓冲。
运行此代码
#include <stdio.h>
#include <threads.h>
int main(void)
{
setbuf(stdout, NULL); // unbuffered stdout
putchar('a'); // 'a' appears immediately if stdout is unbuffered
thrd_sleep(&(struct timespec){ .tv_sec = 1 }, NULL); // sleep 1 sec
putchar('b');
}
输出:
ab
引用
- C23 标准 (ISO/IEC 9899:2024):
- 7.21.5.5 setbuf 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018):
- 7.21.5.5 setbuf 函数 (p: 225)
- C11 标准 (ISO/IEC 9899:2011):
- 7.21.5.5 setbuf 函数 (p: 307-308)
- C99 标准 (ISO/IEC 9899:1999):
- 7.19.5.5 setbuf 函数 (p: 273)
- C89/C90 标准 (ISO/IEC 9899:1990):
- 4.9.5.5 setbuf 函数
参阅
| 设置文件流的缓冲区及其大小 (函数) | |
C++ 文档 关于 setbuf
| |