/*********************************************
* @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);
!subtitle:说明
设置文件流的缓冲区和缓冲模式。
!subtitle:参数
fp - 要操作的文件流
buffer - 指向缓冲区的指针;如果仅更改大小或模式,可以传 NULL
mode - 缓冲模式
size - 缓冲区大小
!subtitle:返回值
成功时返回 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),因此 buf 在 stdout 关闭之前释放了。
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