C程序里 文件读写的问题

zengkun100 2007-11-08 02:33:23
在我的程序里会写文件,为了保护文件不因为意外的原因被损毁,我定时备份一份。代码大致是这样的:
void SaveFile()
{
static int counter = 0;
------------------把内存里的东西写进文件---------------------------------------
//打开待写的文件,
FILE * fp = fopen( filename, "w" );
//向文件里写
fprintf(fp, ……)
//关闭文件
fclose(fp)
------------------把内存里的东西写进备份文件----------------------------------
if(++counter%5 == 0)
{
//打开备份文件,
FILE * fp = fopen( bakfilename, "w" );
//向备份文件里写
fprintf(fp, ……)
//关闭备份文件
fclose(fp)
}
}

SaveFile函数200毫秒被调用一次。每200毫秒,程序就会把内存的内容写入文件,每1秒钟,把内存的内容向备份文件里写一份。
我觉得按照我上面的代码逻辑,任何时候只有一个文件在操作,这样即使程序意外死掉,或者机器掉电,那么也只有一个文件被损坏,另一个文件是好的。
可事实上,在按下reset键后,发现2个文件都被损坏了。

不知道为什么啊!请高人指教!
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
到这来讨论吧

菜鸟学编程之C++/MFC: QQ群 41977413 C++/MFC编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加

菜鸟学编程之C/C# : QQ群 41976716 C/C#编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加

菜鸟学编程之VB/ VBA : QQ群 20772662 VB/ VBA编程开发技术群,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加
BEYOND_Q 2007-11-11
  • 打赏
  • 举报
回复
这时因为,你每隔一秒有打开文件,当你打开文件时,如果这个时候你RESET的话,文件是不会保存到硬盘中去的。你可以在程序里加个fflush函数,强制把内存文件写入硬盘里
  • 打赏
  • 举报
回复
SaveFile函数200毫秒被调用一次。每200毫秒,程序就会把内存的内容写入文件,你是怎么控制的,是#include "signl.h"
做的吗?然后用alarm()方法吗?估计是你调用函数没处理好,把它实现的和闹钟差不多,用信号做,把备份和写文件做为两个信号,到什么时间就调用这个方法就行了。
proware 2007-11-09
  • 打赏
  • 举报
回复
FILE * fp = fopen( filename, "w " );

猜测和打开方式有关的。。

w为把文件截断至0长,或为写而创建。。
建议改为:a+或者a+b
然后再试试。。。
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
我踢了一脚reset键,鬼知道fprintf返回的是正确还是错误。
我在C++版也提了这个问题。在经过几个小时的奋战之后。
我尝试了如下几种办法:
1:把源文件和备份文件写在不同的分区里,不行(想想要是非得这样做备份,Windows就不用混了)
2:在每个fprintf之后,调用fflush,在fclose之前再调用一次fflush,不行
3:增加备份和写文件的时间间隔,扩大到以前的5倍,不行

4:把所有的C运行时文件读写函数换成WinAPI文件读写,函数。成功了! 目前我已经踢了reset键5脚了,暂时还没有发现问题 :-)

bamboostflying 2007-11-08
  • 打赏
  • 举报
回复
是不是和你这些I/O操作都是带缓冲有关系
你用open/write呢?
_石头_ 2007-11-08
  • 打赏
  • 举报
回复
建议备份在不容的磁盘区间!
另外,由于代码不全,无法判断是不是写入文件出错造成的。建议在每个写文件的功能代码内加一句判断写文件是否成功的语句,即fprintf()的返回之如果是个负数,证明写文件出现错误,那就需要更改文件写入的代码!然后再做下一步分析!
rezood 2007-11-08
  • 打赏
  • 举报
回复
加锁吧,是不是前一次写的时间大于200毫秒了
飞哥 2007-11-08
  • 打赏
  • 举报
回复
难道是机制有问题?

应该保证原来的文件是好的,至于后来的可能管不了那么多了

可能还需要加锁



----仅供参考
weijiangshanwww 2007-11-08
  • 打赏
  • 举报
回复
因为不知道楼主的具体情况

只能做个猜测了!

可能是写文件的时间超过一秒,这就造成了一直在写。很可能一掉电文件都坏了!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧