C语言 fwrite 覆盖文件原始数据问题

在项目中遇到文件数据丢失问题,初步怀疑数据被覆盖。尝试使用fflush、setbuf和setvbuf未解决问题。后通过博客发现fflush仅确保IO缓冲写入系统缓冲,但何时写入磁盘由系统决定。解决方案是在fwrite后使用fsync(fd)强制数据写回硬盘,此方法在大多数情况下有效,但部分SD卡可能存在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在整项目时发现向文件中嵌入数据时,数据会丢失,但是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卡会出现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值