我这么做,没遇到什么问题啊!!
你最好把fclose(fp)换成
if(fclose(fp)) printf( "The file was not closed,something wrong!\n" );
来看看fclose是否顺利正确执行成功。
你的打开方式是“只读”和“二进制”,看看你对文件的操作有什么不符合这个打开方式的。
你最好把fclose(fp)换成
if(fclose(fp)) printf( "The file was not closed,something wrong!\n" );
来看看fclose是否顺利正确执行成功。
你的打开方式是“只读”和“二进制”,看看你对文件的操作有什么不符合这个打开方式的。
解决方案 »
- web services 虚拟机 vs2005
- 程序被挂起,请问是怎么回事啊
- 谁能告诉我client与server之间如何通过ISupportErrorInfo接口传递错误信息?最好有代码例子
- 加了壳的程序能不能用Import Address Table 写入截住API?
- 怎样把工程的debug版本换成release版本来编译?急急急急急急
- 请教:CDaoDatabase无法打开odbc(access)
- 请教为什么不能cout<<a[i]
- GB2312或UTF-8如何转ISO-8859-1
- again0: again1: 语句什么意思?
- 使用UpdateLayeredWindow()后,窗口位置会被改掉,如何恢复或禁止更改?
- 关于在OpenGL编程中生成中文文本的问题?
- 该死的指针问题,谁能告诉为什么!!!??????
我已经试了一天了,什么方法都试过了,连closehandle我都已经用过了,还是没戏。
我一开始也觉得是fclose 的问题,可是换了FILE *fp1; 还是不行! 代码不是我写的,是我们这里一个50岁的老同志写的,他说他那里用PB 调用就没有问题,我不好意思去和他争论,只能自己在这里傻傻的解!
关于FILE的结构建议看一下stdio.h的原文件。
最后你把相关的原文件都贴上来,这样大家才能分析。
当然象fopen,fgetc等以前在DOS下使用的函数是没有句柄概念的,当然也不能把句柄当作参数。句柄是Win下为每一个进程所拥有,实际指向系统的内核对象,它的数据结构是有微软掌握,不开放的,你只能通过API函数进行操作。在一个进程内,句柄值实际上是一个索引值。
希望对你有帮助。
fclose 返回失败 返回值是-1
可是这是为什么呢! 我该怎么办啊!
你的文件是以只读方式打开的,所以你不能对这个文件进行写操作,如果你做了写操作,fclose 会失败,检查一下吧
fclose 失败,看是否有其它用到此文件.
fp=fopen(...);
test it!
fp=fopen(...);
test it!
我干脆把代码贴出来好了!谢谢大家 替我看看!
FILE *fp; // open data file for city_name_fixed table
if ((fp=fopen("city_n1.dat","rb")) == NULL) {
portstr = "没找到固定城市名文件(CITY_N1.DAT)! ";
AfxMessageBox(portstr);
city_name_fixed_init_flag = 0;
return -1;
} //get the city_name_fixed table's length
li_length = 0;
do {
lc_char = fgetc(fp);
if ((lc_char >= '0') && (lc_char <= '9')) {
li_length *= 10;
li_length += (int)lc_char - 48; //得到整数
}
} while (lc_char != LF); if (li_length == 0) {
portstr = "没有固定城市名表!";
AfxMessageBox(portstr);
return 0;
}
//apply memory for city_name_fixed table
city_name_fixed = (unsigned char *)_fmalloc((long int)li_length * CITY_NAME_1);
if(city_name_fixed == NULL){
portstr = "内存不够,不能加载固定城市名!";
AfxMessageBox(portstr);
city_name_fixed_init_flag = 0;
return -1;
}
lp_temp = city_name_fixed; for (li_temp = 0; li_temp < li_length; li_temp ++) { lp_1temp = lp_temp;
//三字代码
lc_char = fgetc(fp);
if (lc_char == EOF) {
break;
}
*lp_1temp = lc_char;
lp_1temp ++;
lc_char = fgetc(fp);
if (lc_char == EOF) {
break;
}
*lp_1temp = lc_char;
lp_1temp ++;
lc_char = fgetc(fp);
if (lc_char == EOF) {
break;
}
*lp_1temp = lc_char;
lp_1temp ++;
do {
lc_char = fgetc(fp);
if (lc_char == EOF) {
*lp_1temp = CHAR_NUL;
li_temp ++;
goto end_for;
}
if (lc_char >= SP) {
*lp_1temp = lc_char;
lp_1temp ++;
}
} while (lc_char != LF);
*lp_1temp = CHAR_NUL;
if (li_temp != (li_length - 1)) lp_temp += CITY_NAME_1;
}end_for:
fclose(fp);//这步可以运行到,但是返回为-1
city_name_fixed_length = li_temp;
city_name_fixed_init_flag = 1;
get_users:
///////////////////////////////
if (city_name_user_init_flag == 1) {
return 0;
} // open data file for city_name_user table
//到这步就死翘翘了
if ((fp=fopen("city_n2.dat","rb")) == NULL) {
portstr = "没找到用户定义城市名文件(CITY_N2.DAT)! ";
AfxMessageBox(portstr);
city_name_user_init_flag = 0;
return -1;
}
if ((fp=fopen("city_n2.dat","rb")) == NULL) {
portstr = "没找到用户定义城市名文件(CITY_N2.DAT)! ";
AfxMessageBox(portstr);
city_name_user_init_flag = 0;
return -1;
} //--------------------------------
放到end_for:前面去
do {
lc_char = fgetc(fp);
if (lc_char == EOF) {
*lp_1temp = CHAR_NUL;
li_temp ++;
goto end_for;
}
if (lc_char >= SP) {
*lp_1temp = lc_char;
lp_1temp ++;
//要是一直是>=sp的东东永远没有LF,也就是一行太长,一直往内存里放lc_char,那几乎肯定造成崩溃
if ((DWORD)lp_1temp-(DWORD)city_name_fixed> ((DWORD)li_length * CITY_NAME_1)){TRACE0("行太长再运行就要破坏内存啦!");ASSERT(FALSE);} }
} while (lc_char != LF);
多谢 问题解决了! 可是这是为什么呢!!!
不好意思 不好意思 我看错了 不能挪 不能挪 一挪地方就不运行我下面的代码了。这个代码不是我写的,其实是人家给我的一个DLL 叫我调用,结果现在害的我要在这里给他改错。烦死了。
仔细看看程序流程,程序定义的切入点如你程序中:
end_for:......get_user:......
}
则从end_for:到get_user:之间的都属end_for:内容
从get_user:到末尾属get_user内容,GOTO语句最好少用
你改成函数吧解决了后记得加分啊,我的分不多了,以后不能提问了
end_for是关闭前一个句柄,
“
//到这步就死翘翘了
if ((fp=fopen("city_n2.dat","rb")) == NULL) {
portstr = "没找到用户定义城市名文件(CITY_N2.DAT)! ";
AfxMessageBox(portstr);
city_name_user_init_flag = 0;
return -1;
} ”
放到前面怎么可以呢?
to cherryppp
你这个函数一定不只调了一次吧?
如果仅仅调了一次,那么查内存泄露
另外,那些fclose都加上去!!!!!!!
fclose调度的不仅仅是应用程序的资源,还包括操作系统的资源
你可以编写一个例子试试试试!
在早期,DOS内核中,使用系统句柄表来控制
在win内核中将这些改为动态的了,可是这种资源还是有限的!
不好意思,说多了,和我写的程序一样罗嗦!
呵呵,我不知道你是高手,呵呵,
高明的PRGER从来都不会允许有显而易见的错误存在,因为这些错误可能导致灾难性的错误!
city_name_fixed_length = li_temp;
city_name_fixed_init_flag = 1;
可以运行到!!!!
city_name_fixed = (unsigned char *)_fmalloc((long int)li_length * CITY_NAME_1);
我们的老同志把的CITY_NAME_1的定义写错了 写成了
#define CITY_NAME_1 3+21 //错误:忘了写括号了
结果分配的内存肯定不够,我和我们的副总天南海北的找了一天半,才发现错在这里了,把我俩给气了个半死。
说老实话,这个问题只是在一开始学习的时候在书本上看到,自己编程很少碰到,今天算是让我碰到了。
最后非常非常 感谢大家。这也当是一个小的前车之鉴,大家引以为戒了。