如何在将数据写入文件时使fwrite()保持一致

时间:2011-05-19 16:14:34

标签: c fwrite

我正在将数据写入文件,但是在突然断电时,我有时会在文件中看到垃圾数据。

有时候数据丢失了,有时会在系统重启时第一次进入文件之前编辑垃圾数据。

有没有办法可以确保fwrite是一致的?

只是添加我每次都使用“a”将数据附加到文件中。

此外,我在文件中看到的垃圾值或内存数据是否真的是由于fwrite()操作?

3 个答案:

答案 0 :(得分:3)

写完后,调用fflush(3)(刷新用户空间缓冲区),然后调用fsync(2)fdatasync(2)以确保所有数据都已写入设备。

答案 1 :(得分:3)

FAT32不是journaling filesystem,因此无法保证一致的写入。即使您在每次写入后刷新磁盘缓冲区,如果在将数据写入磁盘时出现断电,数据仍可能会损坏。

回答你的另一个问题,不,垃圾不是由fwrite引起的,而是因为文件系统还没有完全完成写操作。

答案 2 :(得分:0)

这取决于您的嵌入式操作系统使用的FAT实现。如果您使用的是smxFS,那么您应该利用以下内容:

The DOS/Windows FAT file system is inherently not power fail safe, so smxFS 
implements features to compensate for this:

   1. sfs_chkdsk() API can check and fix many problems, such as cross-linked 
files, lost chains, bad directory entries, and other problems. Flags specify 
which types of problems to fix (or none). It indicates the results using flags 
in the return value and can give detailed text information in a buffer, to 
allow a human operator to correct problems. Please see the smxFS User’s Guide 
for details.
   2. Clean shutdown checking determines whether all files were closed and 
caches flushed before the system shut down. If not, sfs_chkdsk() should be called.

如果您预计会出现意外断电,则应考虑使用能够正确完成写入的电容器或备用电池。您可能需要sfs_fflush和sfs_fclose(或者甚至可能是sfs_fclose,因为它看起来像是自动刷新)

还有其他文件系统选项listed here,虽然它们可能并非都适用于您的应用程序,因为并非所有文件系统选项都可以通过计算机读取OOB。