C-文件输入/输出缓冲区和setvbuf()

Ale*_*osa 6 c buffer file stdio

在C语言中,fopen()是否真的创建了两个缓冲区,一个用于输入,另一个用于输出?

这就是我的C书所说的:

通常,使用标准I/O的第一步是使用f open()打开文件.(回想一下,stdin,stdout和stderr文件是自动打开的.)fopen()函数不仅打开一个文件,而且设置一个缓冲区(两个缓冲区用于读写模式),并设置一个数据包含有关文件和数据的数据的结构

如果使用fopen()打开文件,则会创建两个缓冲区,处于写入模式,如"a +",即读取和写入

FILE * fp = fopen ("file.txt", "a +");
setvbuf (destination_file, NULL, _IOFBF, BUFFER_SIZE);
Run Code Online (Sandbox Code Playgroud)

setvbuf()函数引用了什么缓冲区?

dbu*_*ush 4

打开的文件只有一个缓冲区,无论打开它是为了读取、写入还是两者。

C 标准的第 7.21.5.3 节详细介绍了该fopen功能,规定:

7当使用更新模式打开文件时(+作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对函数fflush或文件定位函数(fseekfsetpos 或rewind)的中间调用,输出后面不得直接跟输入,并且在没有对文件定位函数的中间调用的情况下,输入后面不得直接跟输出,除非输入操作遇到文件结尾。在某些实现中,使用更新模式打开(或创建)文本文件可能会打开(或创建)二进制流。

上面的段落指出,在执行输入之前必须刷新输出缓冲区(通过定位函数显式或隐式),并且在输入之后执行输出时也必须刷新输出缓冲区。这是只有一个缓冲区的结果。

从逻辑角度来看,这也是有意义的,因为它可以防止读取和写入对文件内容的视图不一致。