定时采集数据,每NUM个数据保存成一个文件,用fopen的wt+方式打开,
时不时出现问题,以下程序运行后,出现对地址XXXXXXX的写错误,这估计是因为fp仍为NULL
程序每天运行将近20个小时,运行一个星期,一切正常,偏偏在周末连续运行3天的第一天凌晨出现问题。
系统,windows xp
用户权限,管理员
失败后,指定目录下有以下程序建立的两个空文件,为什么目录下有文件,fp却为空呢?
谢谢各位了,
                     
                        if ((count-NUM-2)%NUM==0&&(count-NUM-2)>=0)
{

fclose(fp);
strcpy(filename,Form6->Edit4->Text.c_str());
itoa(count/NUM+1,filestr,10);
strcat(filename,filestr);
strcpy(filepath,Form6->Edit3->Text.c_str());
strcat(filepath,"\\");

strcat(filepath,filename);
strcat(filepath,".txt");
fp=fopen(filepath,"wt+");
if(fp==NULL)
{
Sleep(1);

strcpy(filename,Form6->Edit4->Text.c_str());
itoa(count/NUM+1,filestr,10);
strcat(filename,filestr);
strcpy(filepath,Form6->Edit3->Text.c_str());
strcat(filepath,"\\");

strcat(filepath,filename);
strcat(filepath,"a");
strcat(filepath,".txt");
fp=fopen(filepath,"wt+");

}
}

做任何IO操作,都要判断返回值,以及错误码.比如说文件被创建之后,未及时关系,此时就有另外一个线程甚至是进程需要以被拒绝的方式去访问该文件,就会导致访问失败.

抱歉,忘了,是应该还有一个t选项,表示文本模式.由于个人习惯只使用二进制模式,把这个选项忽略了.

我不知道是否有t+这个参数

引用 4 楼 yuanreid 的回复:
我不知道是否有t+这个参数

不是t+,而是w+,或者r+,可以带t,表示文本模式.

那应该是w+t, 可以写成wt+吗?

w+t, 可以写成wt+,一个意思。
这个程序呢,时而正常,时而不正常,一周一次,专选周末
所以导致周末的实验白做。
为什么,指定路径下有空白文件,fp却为空?

LZ代码没有注释,对逻辑不是很清楚,特别是窗口控件内容的作用是什么?

count好像是输出记录数的一个计数器

函数开始就调用了fclose(fp);并未判断fp是否有效,其他的没有看出什么问题

不知道为什么后来一定要先创建文件之后才能获得句柄,W+已经部起作用,
必须要先用create函数来建立文件后,或用fopen打开一个存在的文件才起效。

if ((count-NUM-2)%NUM==0&&(count-NUM-2)>=0)  //count为采集数据的次数
{

fclose(fp); //写满当前文件,关闭当前文件
strcpy(filename,Form6->Edit4->Text.c_str()); //获取文件名
itoa(count/NUM+1,filestr,10);  //获取新文件为第几个文件
strcat(filename,filestr);
strcpy(filepath,Form6->Edit3->Text.c_str());
strcat(filepath,"\\");

strcat(filepath,filename);
strcat(filepath,".txt");
fp=fopen(filepath,"wt+");  //建立新文件
if(fp==NULL)              //如果为空再一次创建
{
Sleep(1);

strcpy(filename,Form6->Edit4->Text.c_str());
itoa(count/NUM+1,filestr,10);
strcat(filename,filestr);
strcpy(filepath,Form6->Edit3->Text.c_str());
strcat(filepath,"\\");

strcat(filepath,filename);
strcat(filepath,"a");      //再次创建时,文件名加一个 a
strcat(filepath,".txt");
fp=fopen(filepath,"wt+");

}
}

用ftream文件流方便些
#include <fstream.h>
………
ofstream f("a.txtg",ios::binary|ios::app);

f.write(….);

做fclose(fp); 这种操作前最好判断下,if(fp)

fp=fopen(filepath,"w+b");