539 字
3 分钟
标准IO(二)文件缓冲

缓冲#

为了尽可能减少使用read和write调用的次数,提高效率。标准I/O库提对每个I/O流自动地进行缓冲管理。标准IO具有三种缓冲模式

行缓冲(Line Buffered)

  • 遇到换行符或缓冲区满时刷新
  • 使用flush手动刷新

无缓冲(Unbuffered)

  • 不使用缓冲区
  • 每次IO操作都直接进行

全缓冲(Fully Buffered)

  • 缓冲区满时才进行实际IO操作
  • 使用flush手动刷新

示例#

对于行缓冲理解的小示例

#include "stdio.h"
#include <unistd.h>

int main() {
  printf("u");
  write(STDOUT_FILENO, "m", 1);
  printf("d\n");
}

对于该代码输出应输出: “mud

解释:printf是一个C标准库函数,向stdout中写入数据。stdout采用行缓冲模式,但由于没有换行符且程序未结束,缓冲区内容不会立即刷新到终端。write(STDOUT_FILENO, "m", 1):直接将字符’m’写入标准输出,立即显示。printf("d\n"):将字符’d’和换行符写入stdout缓冲区,换行符触发缓冲区刷新,将之前缓冲的’u’和现在的’d\n’一起输出

可以使用flush刷新缓冲区;

#include "stdio.h"
#include <unistd.h>

int main() {
  printf("u");
  fflush(stdout);
  write(STDOUT_FILENO, "m", 1);
  printf("d\n");
}

对于该代码输出应输出: “umd

setbuf流缓冲操作#

#include <stdio.h>
int setvbuf(FILE *restrict stream, char buf[restrict .size],
			int mode, size_t size);

void setbuf(FILE *restrict stream, char *restrict buf);
void setbuffer(FILE *restrict stream, char buf[restrict .size],
            size_t size);
void setlinebuf(FILE *stream);

setvbuf() 函数可用于任何已打开的流以更改其缓冲方式。参数 mode 必须是以下三个宏之一:

  • _IONBF:无缓冲
  • _IOLBF:行缓冲
  • _IOFBF:完全缓冲(块缓冲)

其余三个函数本质上是 setvbuf() 的别名。 setbuf() 函数等价于以下调用:

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

setlinebuf() 函数等价于以下调用:

setvbuf(stream, NULL, _IOLBF, 0);

参数

  • FILE *restrict stream:要设置缓冲的文件流(stream)指针
  • char buf[restrict .size]: 希望为这个流指定的缓冲区(buffer)。
  • int mode:指定流的缓冲模式
  • size_t size:缓冲区的大小(以字节为单位)

返回值

  • setvbuf() 在成功时返回 0,失败时返回非零值(例如模式无效或请求无法满足)。失败时可能会设置 errno。
标准IO(二)文件缓冲
https://milkfunc.top/posts/标准io二文件缓冲/
作者
CapCake
发布于
2025-07-12
许可协议
CC BY-NC-SA 4.0