刷新文件

时间:2019-06-11 15:03:45

标签: c

具有来自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)上运行代码

2 个答案:

答案 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函数或文件定位函数(fflushfseekfsetpos)的情况下,在输出之后不能直接输入输入,并且除非输入操作遇到文件末尾,否则在没有中间调用文件定位函数的情况下,输入后不应直接跟随输出。在某些实现中,以更新模式打开(或创建)文本文件可能会打开(或创建)二进制流。

以下是发布的代码执行的步骤

  • 文件 example.txt 以读取和更新模式打开。

  • 4个字节(rewind)写入文件,覆盖文件的前4个字节。

  • text刷新流缓冲区,从而允许模式从写入更改为读取。这是评论所指的:fflush()

  • 程序将在不更改位置的情况下切换到读取模式,并尝试从文件中的位置4读取多达79个字节,并在换行符处停止。如果无法读取任何字节,则返回// flushing or repositioning required

  • 此行输出到标准输出。但是请注意,如果文件包含4个字节或更少,则NULL失败并返回fgets(mybuffer, 80, pFile),使数组NULL处于不确定状态,从而导致mybuffer具有不确定的行为。

  • 文件已关闭

答案 1 :(得分:0)

在读取和写入相同的fflush()流时,通常不需要

stdiofputs()fgets()都访问同一个I / O缓冲区,因此在这种情况下通常不需要刷新。

但是有一些限制。即使使用相同的缓冲区,您也必须做一些事情才能在写入和读取之间进行同步。这可以是fflush(),但是如果您使用fseek(),它也会同步。而且,如果您想阅读刚刚写的内容,则必须使用fseek()返回到您开始写的地方。无需fflush()即可进行同步。

但是如果某些 other 进程试图在写入文件时尝试读取文件,则确实需要fflush()。您需要调用fflush()来将数据从I / O缓冲区强制到实际文件,以便其他进程可以看到更改。