具有来自cplusplus.com site的简单代码
#include <stdio.h>
char mybuffer[80];
int main() {
FILE *pFile;
pFile = fopen("example.txt","r+");
if (pFile == NULL)
perror("Error opening file");
else {
fputs("test",pFile);
fflush(pFile); // flushing or repositioning required
fgets(mybuffer, 80, pFile);
puts(mybuffer);
fclose(pFile);
return 0;
}
}
我想知道fflush
在像上面的代码那样以file
作为其自变量的情况下会做什么,因为无论是否有fflush(pFile)
行,结果都是相同的-zh_cn为空缓冲区(输出无内容)。
PS:我正在Linux gcc(6.3.0)上运行代码
答案 0 :(得分:5)
根据C18标准:
7.21.5.3
..headers["Content-Type"] = "application/json"
功能简介
fopen
说明
...
7当以更新模式打开文件时(
#nclude <stdio.h> FILE *fopen(const char * restrict filename, const char * restrict mode);
自变量值的上面列表中的第二个或第三个字符+
),可以在关联的流上执行输入和输出。但是,在没有中间调用mode
函数或文件定位函数(fflush
,fseek
或fsetpos
)的情况下,在输出之后不能直接输入输入,并且除非输入操作遇到文件末尾,否则在没有中间调用文件定位函数的情况下,输入后不应直接跟随输出。在某些实现中,以更新模式打开(或创建)文本文件可能会打开(或创建)二进制流。
以下是发布的代码执行的步骤
文件 example.txt 以读取和更新模式打开。
4个字节(rewind
)写入文件,覆盖文件的前4个字节。
用text
刷新流缓冲区,从而允许模式从写入更改为读取。这是评论所指的:fflush()
程序将在不更改位置的情况下切换到读取模式,并尝试从文件中的位置4读取多达79个字节,并在换行符处停止。如果无法读取任何字节,则返回// flushing or repositioning required
。
此行输出到标准输出。但是请注意,如果文件包含4个字节或更少,则NULL
失败并返回fgets(mybuffer, 80, pFile)
,使数组NULL
处于不确定状态,从而导致mybuffer
具有不确定的行为。
文件已关闭
答案 1 :(得分:0)
fflush()
流时,通常不需要 stdio
。 fputs()
和fgets()
都访问同一个I / O缓冲区,因此在这种情况下通常不需要刷新。
但是有一些限制。即使使用相同的缓冲区,您也必须做一些事情才能在写入和读取之间进行同步。这可以是fflush()
,但是如果您使用fseek()
,它也会同步。而且,如果您想阅读刚刚写的内容,则必须使用fseek()
返回到您开始写的地方。无需fflush()
即可进行同步。
但是如果某些 other 进程试图在写入文件时尝试读取文件,则确实需要fflush()
。您需要调用fflush()
来将数据从I / O缓冲区强制到实际文件,以便其他进程可以看到更改。