为什么下面的代码不起作用?我的意思是,它在控制台输出上显示各种奇怪的字符.
#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或倒带)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾.
这是有原因的:输出和输入通常是单独缓冲的.当有刷新或搜索时,它会将缓冲区与文件同步,但否则会让它们失去同步.这样可以提高性能(例如,当您执行读取操作时,无需检查您读取的位置是否已写入,因为数据已读入缓冲区).