最近在整项目时发现向文件中嵌入数据时,数据会丢失,但是server端明明写入成功了,但是client端在接收时显示原来应该有数据的位置,什么都没有。期初怀疑是后来的数据覆盖了前面写入的数据,结果经过diff返现,应该有数据的位置压根没被改动过。
step 1:可能是缓存的问题,所以在fwrite之后用了fflush方法,清空下缓存。结果没什么用。
step 2:可能是缓冲区的问题,所以用setbuf 和setvbuf方法设置自己的缓冲区。结果依然没什么用。
step 3:经过百度发现了这篇帖子 http://blog.csdn.net/sctq8888/article/details/7409985
这里提到了 fflush()只保证了将IO缓冲写入系统缓冲中,使IO读操作能成功,但系统什么时候写入磁盘,由系统决定所以这里在fwrite之后要强制将数据写回文件中,也就是用如下方法(基于linux系统下)
#include <unistd.h>
int fd = fileno(fp); //获取文件描述符
fsync(fd); //强制写硬盘
最终顺利解决了问题
PS:后来测试发现,不同的SD卡也会对程序的执行有影响,好在大部分SD卡都是可以的,只有极少数厂商的SD卡会出现问题。