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()函数引用了什么缓冲区?
打开的文件只有一个缓冲区,无论打开它是为了读取、写入还是两者。
C 标准的第 7.21.5.3 节详细介绍了该fopen
功能,规定:
7当使用更新模式打开文件时(
+
作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对函数fflush
或文件定位函数(fseek
、fsetpo
s 或rewind
)的中间调用,输出后面不得直接跟输入,并且在没有对文件定位函数的中间调用的情况下,输入后面不得直接跟输出,除非输入操作遇到文件结尾。在某些实现中,使用更新模式打开(或创建)文本文件可能会打开(或创建)二进制流。
上面的段落指出,在执行输入之前必须刷新输出缓冲区(通过定位函数显式或隐式),并且在输入之后执行输出时也必须刷新输出缓冲区。这是只有一个缓冲区的结果。
从逻辑角度来看,这也是有意义的,因为它可以防止读取和写入对文件内容的视图不一致。