Namespaces
Variants

setbuf

From cppreference.net
< c ‎ | io
定义于头文件 <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);
} // buf的生命周期结束,未定义行为

示例

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

参考文献

  • C17 标准 (ISO/IEC 9899:2018):
  • 7.21.5.5 setbuf 函数 (页: 225)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.21.5.5 setbuf 函数 (p: 307-308)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.5.5 setbuf函数(页数:273)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.5.5 setbuf 函数

参考

设置文件流的缓冲区及其大小
(函数)
C++ 文档 for setbuf