《精通Linux C编程》第4.7章流缓冲中提到缓冲区自动刷新的情况:
但是在流被关闭时,并没有执行刷新,见测试代码:
#includeint 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函数,运行结果如下: