刷新文件

Dar*_*ros 2 c

cplusplus.com网站获得简单的代码

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道像上面的代码那样作为其参数的fflush情况下真正会做什么file,因为无论有无fflush(pFile)行,结果都是一样的-空缓冲区(输出无内容)。

PS:我正在Linux gcc(6.3.0)上运行代码

chq*_*lie 5

根据C18标准:

7.21.5.3 fopen功能

概要

#nclude <stdio.h>
FILE *fopen(const char * restrict filename,
            const char * restrict mode);          
Run Code Online (Sandbox Code Playgroud)

描述

...

7以更新模式打开文件时(+作为上述mode参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出。然而,输出不应直接跟随输入而没有插入调用fflush功能或文件定位功能(fseekfsetpos,或rewind),并且输入不应直接跟随输出而没有中间呼叫到一个文件中的定位功能,除非输入操作遇到文件结尾。在某些实现中,以更新模式打开(或创建)文本文件可能会打开(或创建)二进制流。

这是已发布代码执行的步骤

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

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

  • 流缓冲区使用刷新fflush(),从而允许模式从写入更改为读取。这是评论所指的内容:// flushing or repositioning required

  • 程序将切换到读取模式而不更改位置,并尝试从文件的位置4读取多达79个字节,并在换行符处停止。如果无法读取字节,NULL则返回。

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

  • 该文件已关闭