求助,fprintf函数生成文件数量较大时出错

movind 2009-04-29 08:42:03
代码如下,程序运行一次后会生成285个文件,这个过程不会出问题,如果再继续运行一次,则生成到第224个文件后出错,提示:
File:fprintf.c
Line:56
Expression: str!=NULL
。。。
以前也出现过类似情况,用fprintf函数生成的文件比较多时就会出错,实在不知道是因为什么,向高手请教一下,不胜感激!




void ProSail(int dayNum, long *date, float *lai, double *IR, double *NIR) {
char file[50];
char path[30];
int year;
double BRDF[WAVENUM];
FILE *outputFile;
TIME TIMEdata;

void Prospect(REF[]);
int CalculateSail(TIME, LAI, REF[], double[]);

TIMEdata.hour = 12;
TIMEdata.minute = 0;
TIMEdata.second = 0;
TIMEdata.latitude = 40.182;
TIMEdata.logitude = 116.444;
LAIdata.lad = 67;
LAIdata.epsilon = 0.988;

year = date[0] / 1000;
strcpy(path, ".\\OutputFile\\");

for(int i=0; i<dayNum; i++) {
LAIdata.date = date[i] % 1000;
LAIdata.lai = lai[i];
if(lai[i] != 0) {
Prospect(REFdata);
CalculateSail(TIMEdata, LAIdata, REFdata, BRDF);
//文件输出
wsprintf(file, "%s%05ldResult.txt", path, date[i]);
outputFile = fopen(file, "w+");
for(int j=0; j<WAVENUM; j++) {
fprintf(outputFile, "%4d, %lf\r\n", REFdata[j].wavelength, BRDF[j]);
if(j>=46 && j<=58) {
IR[i] += BRDF[j];
}
if(j>=72 && j<=100) {
NIR[i] += BRDF[j];
}
}
IR[i] /= 13;
NIR[i] /= 29;
fclose(outputFile);
}
}
}


...全文
793 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiushuitian 2009-05-31
  • 打赏
  • 举报
回复
代码我没有看,这种情况很可能是打开了文件没有关闭。检查一下。一次打开的文件不能太多
ljhhh0123 2009-05-24
  • 打赏
  • 举报
回复
用确认是调用wsprintf这个接受宽字符串的函数吗?
你确认两次输入的数据都是一样的吗?另外
对你创建的文件文件名进行调试输出,看看有没问题.
movind 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hurricane880 的回复:]
加一句
if ((FILE*fptr = fopen(filename, w+)) == NULL) {
   perror("File filename can't open");
   exit(1);
}
然后控制台下运行,看看出什么错误提示
[/Quote]


试过了,加上检查以后出的错误和没加之前是一样的,应该不是这个问题,我自己感觉应该是是写文件时fprintf函数出的问题,可又不知道究竟错在哪,要如何修改。。。
最头疼的是,运行一次没有问题,连续运行两次就会出问题!
hurricane880 2009-05-17
  • 打赏
  • 举报
回复
加一句
if ((FILE*fptr = fopen(filename, w+)) == NULL) {
   perror("File filename can't open");
   exit(1);
}
然后控制台下运行,看看出什么错误提示
mu_yang 2009-05-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 movind 的回复:]
感谢楼上两位,这个我的确是忘记加了,可是关键问题是文件输出还是有问题,如果是打开文件失败的话,又是因为什么呢?第一次运行时没有问题啊,很不解。。。。
[/Quote]

有没有可能磁盘空间不足啊?

另外“w+” 这个打开方式好象也很奇怪
从你的代码我看不出你需要那个+
当然这一点不至于引起你说的那个错误
jiangyue009 2009-05-13
  • 打赏
  • 举报
回复
超过64K好像有问题啊
ch_tei_hyou 2009-05-06
  • 打赏
  • 举报
回复
后边是和 断言 有关的!你程序按7 楼和8楼的加上异常处理你看还会出现同样的错误吗?

文件操作是互斥的!
movind 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ch_tei_hyou 的回复:]
C/C++ code
/*
*你看你是不是给他传入了一个null的文件指针?
*或者因为同时生成文件多,asserts错误?
* handle the (hopefully rare) case of
*
* 1) ASSERT while already dealing with an ASSERT
* or
* 2) two threads asserting at the same time
*/
[/Quote]

可是文件指针为什么会是NULL呢?前面生成文件时没有问题啊,连续运行两次为什么会出问题呢。。。
后面的部分没有看懂。。。。我是新手,能解释一下吗?多谢啦!!
movind 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
你的目的是实现什么?
[/Quote]


这是一个光谱模拟模型程序,程序运行后会生成一些光谱模拟数据的文件
movind 2009-04-30
  • 打赏
  • 举报
回复
感谢楼上两位,这个我的确是忘记加了,可是关键问题是文件输出还是有问题,如果是打开文件失败的话,又是因为什么呢?第一次运行时没有问题啊,很不解。。。。
Cpp权哥 2009-04-30
  • 打赏
  • 举报
回复
楼主在打开文件语句之后不检查成功与否,这个习惯很不好。一定要加上检查!
if( (outputFile = fopen(file, "w+"))==NULL )

/*错误处理*/

hjjdebug 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 movind 的帖子:]
代码如下,程序运行一次后会生成285个文件,这个过程不会出问题,如果再继续运行一次,则生成到第224个文件后出错,提示:
File:fprintf.c
Line:56
Expression: str!=NULL
。。。
以前也出现过类似情况,用fprintf函数生成的文件比较多时就会出错,实在不知道是因为什么,向高手请教一下,不胜感激!



[/Quote]
是文件打开失败! 所以引起fprint 非法操作文件指针。
outputFile = fopen(file, "w+");
加上
if(outputFile == NULL)
{
printf("error open %s file to write\n",file);
exit(1);
}
xiaoxiaodetuzi 2009-04-30
  • 打赏
  • 举报
回复
帮顶
xiaoxiaodetuzi 2009-04-30
  • 打赏
  • 举报
回复
帮顶```````
xiaoxiaodetuzi 2009-04-30
  • 打赏
  • 举报
回复
帮顶~~~
ch_tei_hyou 2009-04-30
  • 打赏
  • 举报
回复

/*
*你看你是不是给他传入了一个null的文件指针?
*或者因为同时生成文件多,asserts错误?
* handle the (hopefully rare) case of
*
* 1) ASSERT while already dealing with an ASSERT
* or
* 2) two threads asserting at the same time
*/
  • 打赏
  • 举报
回复
你的目的是实现什么?
liliangbao 2009-04-29
  • 打赏
  • 举报
回复
帮顶~

69,379

社区成员

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

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