命名空间
变体
操作

setbuf

来自 cppreference.com
< c‎ | io
 
 
文件输入/输出
类型和对象
函数
文件访问
直接输入/输出
非格式化输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
格式化输入
(C99)(C99)(C99)(C11)(C11)(C11)     
 
定义在头文件 <stdio.h>
void setbuf( FILE          *stream, char          *buffer );
(until C99)
void setbuf( FILE *restrict stream, char *restrict buffer );
(since C99)
#define BUFSIZ     /*未指定*/

设置用于流操作的内部缓冲区。它至少应为 BUFSIZ 个字符长。

如果 buffer 不为 null,则等效于 setvbuf(stream, buffer, _IOFBF, BUFSIZ).

如果 buffer 为 null,则等效于 setvbuf(stream, NULL, _IONBF, 0),这将关闭缓冲。

内容

[编辑] 参数

stream - 要设置缓冲区的文件流
buffer - 指向流要使用的缓冲区的指针。如果提供 null 指针,则缓冲将关闭

[编辑] 返回值

无。

[编辑] 说明

如果 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 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 函数

[编辑] 另请参阅

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