C++ 文件读写的问题

zengkun100 2007-11-08 02:39:27
在我的程序里会写文件,为了保护文件不因为意外的原因被损毁,我定时备份一份。代码大致是这样的:
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个文件都被损坏了。

不知道为什么啊!请高人指教!
...全文
582 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
gengxt2003 2007-11-12
  • 打赏
  • 举报
回复
我现在也是遇到了这个问题:
我每个小时开始的时候新建一个文件,用 FILE *m_file = fopen(file.c_str(), "rb+"),
然后每隔1秒往这个文件里面写一个结构体数据,
使用 fwrite((char*)&m_st, sizeof(m_st), 1, m_file);

经常会出现两种莫名其妙的情况:
1) 在这个文件的一个固定的地方经常写入一些莫名其妙的数据;
2) 在每个小时开始的时候新建一个文件,往其中写入一些数据,然后就再也不往其中写数据了。

我在考虑是不是fwrite() 函数产生的问题?
请各位帮忙看看,谢谢!

binjuny 2007-11-10
  • 打赏
  • 举报
回复
同意Lihao,你打开时使用的参数不对,“w”一般用于覆盖文件哦~~~~~~~~~~~~
Torch009 2007-11-10
  • 打赏
  • 举报
回复
“w”应该会清空以前的文件。
c305233881 2007-11-10
  • 打赏
  • 举报
回复
这问题太深奥了啊 我也想知道这些知识啊 谁能推介本好书吗
liu--sheng 2007-11-10
  • 打赏
  • 举报
回复
/*1.设计一个类,实现十进制到十六进制、二进制、八进制的转换。
成员函数包括构造函数、转换函数和输出转换后数值的函数,
并编写主函数进行测试(可选择使用成员函数重载、构造函数重载等方法实现)。*/
#include<iostream.h>
class change
{
private:
int t,k;

public:
char *p;
change()
{
cout<<"调用构造函数!"<<endl;
}
void fun(int m,int n)
{
while(n)
{int i=0;
k=n/m;
t=n%m;
if(t<=9)
p[i]='0'+t;
else p[i]=(t-9)+'A';
n=k;
i++;

}
}
void print()
{
for(int i=sizeof(*p); i>=0;i--)
cout<<p[i]<<endl;
}
};
void main()
{
change A;
int x=2,y=5;
A.fun(x,y);
A.print();
}
kendan 2007-11-09
  • 打赏
  • 举报
回复
up
dazhuaye 2007-11-09
  • 打赏
  • 举报
回复
也来看看~!~
lihao1111111111 2007-11-09
  • 打赏
  • 举报
回复
FILE * fp = fopen( filename, "w " );
你第次都重新写文件!
出错时当然就没有了.
改成"a"或"w+"试试看.
mgtcllxl 2007-11-09
  • 打赏
  • 举报
回复
这个东西值得关注,MARK
weiliangjian123 2007-11-09
  • 打赏
  • 举报
回复
我觉得是没有问题啊?lz 你是不是bios有问题啊!!可以调下...
wenmingcool 2007-11-09
  • 打赏
  • 举报
回复
等一下
wjlsmail 2007-11-08
  • 打赏
  • 举报
回复
C 的f开头的函数为何不如WinAPI呢?WinAPI在底下又是怎么做的呢?
这样在Windows下没有问题了,在Linux下又怎么去保证正确呢?(虽然楼主没有说跨平台,但C文件操作函数的问题值得关注一下。)

谁能分析一下?
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
Tiger_Zhao,强悍!

对C的那些f开头的文件相关函数有点失望,以后只用WinAPI了 :)
Tiger_Zhao 2007-11-08
  • 打赏
  • 举报
回复
年龄大接触的语言就多:
ASM至今离不开手册;
学校里学的是Ansi C,不过更喜欢用 Pascal;
为老师打工用的是Power Builder;
参加工作用 VB,n年后成了老鸟;
现在有时用 .Net。
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
在我把所有的C运行时文件读写函数换成了WinAPI之后,再没出现过2个文件同时损坏的情况。
不知道是不是我的机器今天下午被我踢reset键踢得受不了了:)

我把fopen换成了createfile
把fflush换成了FlushFileBuffers

我用的是VC2005

再看看,暂时先不结帖。

Tiger_Zhao,我看你不光是VB老鸟啊!
Tiger_Zhao 2007-11-08
  • 打赏
  • 举报
回复
以为你用指定TimerProc的方式创建的Timer。
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
while(GetMessage(&msg,NULL,NULL,NULL ))
{
case: WM_TIMER
SaveFile(……)
}
我想不出来怎么能重入呢?这可是在同一个线程内呢。
Tiger_Zhao 2007-11-08
  • 打赏
  • 举报
回复
timer应该是可以重入的。
fopen写了的什么东西,可能程序异常是该内容清零了。
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
打开一个文件,驱动程序其实要执行很多个过程,我不晓得怎么就把文件的内容全部都变成0了。按理说只要文件被fopen成功了,长度就会变成0。但是在fopen的实现中,还要执行多少个操作,我也不晓得。

被损坏的文件,大小不为0,但是内容全是0(二进制的0)。
zengkun100 2007-11-08
  • 打赏
  • 举报
回复
SaveFile是在一个这样的线程中被调用的

这个线程里有一个timer,每当timer报时的时候就调用一下SaveFile,这样,即使SaveFile在下次timer报时的时候没有执行完,那timer就算报时了也没用啊。
加载更多回复(13)
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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