命名空间
变体
操作

setbuf

来自 cppreference.cn
< 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 不为 null,则等同于 setvbuf(stream, buffer, _IOFBF, BUFSIZ)

如果 buffer 为 null,则等同于 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

[编辑] 参考

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

[编辑] 另请参阅

为文件流设置缓冲区及其大小
(函数) [编辑]
C++ 文档 for setbuf