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

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

但是,下面的代码运行良好。
#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;
    }
}

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

最佳答案

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



这是有原因的:通常将输出和输入分别缓冲。当发生刷新或查找时,它将使缓冲区与文件同步,但否则会使缓冲区脱离同步。这通常可以提高性能(例如,当您执行读取操作时,不必检查自从将数据读取到缓冲区以来是否已从读取位置写入了数据)。

关于c - 为什么需要刷新我的I/O流以获得正确的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2230636/

10-11 23:04