牛骨文教育服务平台(让学习变的简单)
博文笔记

fwrite不能向文件中写入内容

创建时间:2018-01-24 投稿人: 浏览次数:330

原帖地址:http://blog.csdn.net/zhangxiong2532/article/details/50608898

最近项目代码中遇到很多奇怪的问题,比如,在某个程序中用fwrite向配置文件中写入一些数据,而在另一段代码中需要读取该配置文件中的数据,写文件那段程序已经执行完了,但是数据并没有被写入文件,进而导致读文件的代码读不到数据,程序很难按理想的方式运行。这样下来将会导致一些列的问题,我今天就被这个问题纠结了一下午...

那么这个问题是什么原因导致的呢,该怎么解决呢?

导致问题的原因是用fwrite函数写数据的时候,fwrite先将数据写到内存中的缓冲区内,
等程序结束后才会将数据由缓冲区写入文件。所以我遇到的问题原因是整个函数还没有运行完毕,写入的数据还在缓冲区内。
解决办法就只有靠fflush()函数了。
#include<stdio.h>

int fflush(FILE *stream)

该函数的作用就是刷新缓冲区

做法是,在写入的数据在函数结束之前就需要的时候,调用fwrite等函数后,紧接着调用fflush()函数将缓冲区刷新,这样数据就会被立刻写入文件而不用等到程序结束(因为之前的数据都在缓冲区里)。


下面通过一个简单的例子让小伙伴们 加深理解:

[html] view plain copy
  1. int main()  
  2. {  
  3.     FILE *fp = fopen("./file.txt","a");  
  4.     if(fp == NULL)  
  5.     {  
  6.         printf("open file err! ");  
  7.         return -1;  
  8.     }  
  9.     fwrite("hello",5,1,fp);  
  10.     //fflush(fp);  
  11.     close(fp);  
  12.       
  13.     while(1)  
  14.     {  
  15.         sleep(5);  
  16.     }  
  17.     return 0;  
  18. }  

如上程序,当程序一直不退出的时候,虽然已经调用了fwrite但是数据却在缓冲区里,而并不在文件中,这时你可以查看改路径下的file.txt文件,你会发现文件已经建立但是大小为0,如果你在fwrite之后用fflush函数后数据就会立刻写入文件。


ps:fprintf函数同样也是类似缓冲区的机制,不会立即写入文件

ps:数据会在程序正常结束或者调用关闭文件之前写入,在无限循环之前调用fclose函数也可以将数据写入文件


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。