Namespaces
Variants

setbuf

来自 zh.cppreference.net
< c | io
 
 
文件输入/输出
类型和对象
        
函数
文件访问
(C95)
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
 
定义于头文件 <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