2045

10 分钟

#C 语言标准库函数 setvbuf

/********************************************* * @brief 设置缓冲区 * @param fp 文件流 * @param buffer 缓冲区 * @param mode 缓冲模式 * @param size 缓冲区大小 * @return 是(0)否(非 0)成功 ********************************************/ int setvbuf(FILE* restrict fp, char* restrict buffer, int mode, size_t size);

说明

设置文件流的缓冲区和缓冲模式。

参数

  • fp - 要操作的文件流
  • buffer - 指向缓冲区的指针;如果仅更改大小或模式,可以传 NULL
  • mode - 缓冲模式
  • size - 缓冲区大小

返回值

  • 成功时返回 0
  • 失败时返回非 0

#缓冲模式

名称说明
_IOFBF全缓冲缓冲区满时写入目标设备
_IOLBF行缓冲缓冲区满或遇到换行符(\n)时写入目标设备
_IONBF无缓冲数据直接写入目标设备
  • 通过 fopen 打开的文件流默认使用全缓冲
  • 标准输入 stdint 与交互式设备(命令行)关联时默认使用行缓冲,否则默认使用全缓冲
  • 标准输出 stdout 与交互式设备(命令行)关联时默认使用行缓冲,否则默认使用全缓冲
  • 标准错误 stderr 默认无缓冲

#注意事项

必须保证缓冲区 buffer 在文件流关闭前始终有效。错误示范:

#include <stdio.h> int main(void) { char buf[1024]; setvbuf(stdout, buf, _IOLBF, 1024); // 将 buf 设为 stdout 的缓冲区 return 0; } // buf 的生命周期结束被释放

示例中 main 函数返回时局部变量 buf 立即释放,然后程序进行退出前的清理操作(包括关闭 stdout),因此 bufstdout 关闭之前释放了。

#推荐阅读

#参考标准

  • C17 standard (ISO/IEC 9899:2018):
    • 7.21.5.6 The setvbuf function (p: 225)
  • C11 standard (ISO/IEC 9899:2011):
    • 7.21.5.6 The setvbuf function (p: 308)
  • C99 standard (ISO/IEC 9899:1999):
    • 7.19.5.6 The setvbuf function (p: 273-274)
  • C89/C90 standard (ISO/IEC 9899:1990):
    • 4.9.5.6 The setvbuf function

创建于 2025/8/12

更新于 2025/8/12