命名空间
变体
操作

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 非空,则等效于 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

[编辑] 参考

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

[编辑] 参见

为文件流设置缓冲区及其大小
(function) [编辑]