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。