《精通Linux C编程》第4.7章流缓冲中提到缓冲区自动刷新的情况:
但是在流被关闭时,并没有执行刷新,见测试代码:
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
FILE *fp1 = NULL;
char buf[100] = {0};
fp = fopen("./test.txt","w"); //打开一个文件,并写入两行数据
if(fp == NULL)
{
perror("fopen");
}
fprintf(fp,"1.hello c!\n");
fprintf(fp,"2.hello world!\n");
/* 手动刷新
fflush(fp);
*/
close(fp); //调用close关闭流
if((fp1 = fopen("./test.txt","r+")) == NULL) //重新打开文件
{
perror("fopen");
}
if(fgets(buf,100,fp1) == NULL) //读取一行数据
{
if(feof(fp1))
{
printf("End of file\n");
}
else
{
printf("read failed\n");
}
}
puts(buf); //输出此行数据
//fflush(fp1);
fprintf(fp1,"3.new line data!\n"); //再写入一行数据
//fputs("3.new line data!",fp);
fgets(buf,10,fp1); //再读一行数据
puts(buf);
//fflush(fp1);
close(fp1);
return 0;
}
执行结果:
原因是写入的两行数据未及时缓冲到文件中,导致fgets读取不到数据,修改后的代码 在写入两行数据后,手动调用fflush函数,运行结果如下: