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个文件都被损坏了。

不知道为什么啊!请高人指教!
...全文
298 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
  • 打赏
  • 举报
回复
因为不知道楼主的具体情况

只能做个猜测了!

可能是写文件的时间超过一秒,这就造成了一直在写。很可能一掉电文件都坏了!
[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup辅助程序 6 读核感悟 Linux内核启动 内核解压缩 8 读核感悟 Linux内核启动 开启页面映射 9 读核感悟 Linux内核启动 链接脚本 11 读核感悟 伪装现场 系统调用参数 13 读核感悟 伪装现场 fork 系统调用 15 读核感悟 伪装现场 内核线程: 17 读核感悟 伪装现场 信号通信 19 读核感悟 kbuild系统 内核模块的编译 22 读核感悟 kbuild系统 编译到内核和编译成模块的区别 24 读核感悟 kbuild系统 make bzImage的过程 26 读核感悟 kbuild系统 make menuconfig 31 读核感悟 文件系统 用C来实现面向对象 32 读核感悟 设计模式 用C来实现虚函数表和多态 32 读核感悟 设计模式 用C来实现继承和模板 33 读核感悟 设计模式 文件系统和设备的继承和接口 34 读核感悟 设计模式 文件系统与抽象工厂 36 读核感悟 阅读源代码技巧 查找定义 37 读核感悟 阅读源代码技巧 变量命名规则 42 读核感悟 内存管理 内核中的页表映射总结 43 读核感悟 健壮的代码 exception table 内核中的刑事档案 44 读核感悟 定时器 巧妙的定时器算法 45 读核感悟 内存管理 page fault处理流程 45 读核感悟 文件读写 select实现原理 47 读核感悟 文件读写 poll的实现原理 49 1 功能介绍: 49 2 关键的结构体: 49 3 poll的实现 49 4 性能分析: 50 读核感悟 文件读写 epoll的实现原理 50 1 功能介绍 50 2 关键结构体: 51 3 epoll create的实现 53 4 epoll ctl的实现 53 5 epoll wait的实现 54 6 性能分析 54 读核感悟 同步问题 同步问题概述 55 1 同步问题的产生背景 55 2 内核态与用户态的区别 55 读核感悟 同步问题 内核态自旋锁的实现 56 1自旋锁的总述 56 2非抢占式的自旋锁 56 3 锁的释放 57 4 与用户态的自旋锁的比较 57 5 总结 58 读核感悟 内存管理 free命令详解 58 读核感悟 文件读写 2 6 9内核中的AIO 59 1 AIO概述 59 2 内核态AIO的使用 61 读核感悟 文件读写 内核态AIO相关结构体 61 1 内核态AIO操作相关信息 61 2 AIO上下文: 63 3 AIO ring 63 4 异步I O事件的返回信息 64 读核感悟 文件读写 内核态AIO创建和提交操作 65 1 AIO上下文的创建 io setup 65 2 AIO请求的提交:io submit实现机制 66 读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO 67 已上传7本: [14本经典Android开发教程] 1 Android开发从入门到精通 http: download csdn net detail cleopard 8355245 [14本经典Android开发教程] 2 Android开发手册 API函数详解 http: download csdn net detail cleopard 8374487 [14本经典Android开发教程] 3 Android SDK 中文开发文档 http: download csdn net detail cleopard 8380429 [14本经典Android开发教程] 4 Android应用程序开发36技 http: download csdn net detail cleopard 8380495 [14本经典Android开发教程] 5 linux Android基础知识总结 http: download csdn net detail cleopard 8380529 [14本经典Android开发教程] 6 Android驱动开发入门及手机案例开发分析教程 http: download csdn net detail cleopard 8388019 [14本经典Android开发教程] 7 Android编程入门教程 http: download csdn net detail cleopard 8388043 剩余8本稍后上传 @或直接从这寻找@ http: download csdn net user cleopard album @更多@ http: cleopard download csdn net 福利 http: xuemeilaile com 17份软件测试文档 http: download csdn net album detail 1425 13份WPF经典开发教程 http: download csdn net album detail 1115 C#资料合辑二[C#桌面编程入门篇] http: download csdn net album detail 957 C#资料合辑一[C#入门篇] http: download csdn net album detail 669 [Csharp高级编程 第6版 ] 共8压缩卷 http: download csdn net album detail 667 10个[精品资源]Java学习资料合辑[一] http: download csdn net album detail 663 10个C#Socket编程代码示例 http: download csdn net album detail 631 6份GDI+程序设计资源整合[全零分] http: download csdn net album detail 625 2014年移动游戏行业数据分析 http: download csdn net detail cleopard 8340331 一文读懂2014年全球互联网广告新生态 http: download csdn net detail cleopard 8340303">[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核 [更多]

70,040

社区成员

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

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