为什么我需要刷新I/O流才能获得正确的结果?

Jae*_*bum 10 c iostream

为什么下面的代码不起作用?我的意思是,它在控制台输出上显示各种奇怪的字符.

#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);

        fgets (mybuffer,80,pFile);
        puts (mybuffer);
        fclose (pFile);
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,下面的代码运行良好.

#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);    
        fgets (mybuffer,80,pFile);
        puts (mybuffer);
        fclose (pFile);
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我需要刷新流以获得正确的结果?

Jer*_*fin 12

因为标准是这样说的(§7.19.5.3/ 5):

当使用更新模式打开文件时('+'作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出.但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或倒带)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾.

这是有原因的:输出和输入通常是单独缓冲的.当有刷新或搜索时,它会将缓冲区与文件同步,但否则会让它们失去同步.这样可以提高性能(例如,当您执行读取操作时,无需检查您读取的位置是否已写入,因为数据已读入缓冲区).


Rob*_*ves 7

使用具有读/写模式的文件时,必须在不同的i/o操作之前调用fseek/fflush.

看到这个答案为什么总是需要fseek或fflush ...