我这么做,没遇到什么问题啊!!
你最好把fclose(fp)换成
if(fclose(fp)) printf( "The file was not closed,something wrong!\n" );
来看看fclose是否顺利正确执行成功。
你的打开方式是“只读”和“二进制”,看看你对文件的操作有什么不符合这个打开方式的。

解决方案 »

  1.   

    多谢大家了
    我已经试了一天了,什么方法都试过了,连closehandle我都已经用过了,还是没戏。
    我一开始也觉得是fclose 的问题,可是换了FILE  *fp1;   还是不行! 代码不是我写的,是我们这里一个50岁的老同志写的,他说他那里用PB 调用就没有问题,我不好意思去和他争论,只能自己在这里傻傻的解!
      

  2.   

    你的编译系统是什么,看看内部的开关是否有问题。我原来有一次在TC中编译通过的程序其中的指针在BC3.0中就报错。看看是否和此有关。
      

  3.   

    还有 我想 我用fileopen 或者是CreateFile 来代替 fopen 但是返回值一个句柄,我想知道知道个句柄能否被当做一个指针 在后面的 fgetc 函数里调用!!!
      

  4.   

    我只能说的是Windows下编程推荐使用CreateFile函数,因为文件创建是一个内核调用过程,文件实际上也是一个内核对象。
    关于FILE的结构建议看一下stdio.h的原文件。
    最后你把相关的原文件都贴上来,这样大家才能分析。
    当然象fopen,fgetc等以前在DOS下使用的函数是没有句柄概念的,当然也不能把句柄当作参数。句柄是Win下为每一个进程所拥有,实际指向系统的内核对象,它的数据结构是有微软掌握,不开放的,你只能通过API函数进行操作。在一个进程内,句柄值实际上是一个索引值。
    希望对你有帮助。
      

  5.   

    对你们说的对
    fclose 返回失败 返回值是-1 
    可是这是为什么呢! 我该怎么办啊!
      

  6.   

    to cherryppp(老狐狸):
    你的文件是以只读方式打开的,所以你不能对这个文件进行写操作,如果你做了写操作,fclose 会失败,检查一下吧
      

  7.   

    像fopen,fclose之类的操作,每次都要判断成功与否.
    fclose 失败,看是否有其它用到此文件.
      

  8.   

    fp=null;
    fp=fopen(...);
    test it!
      

  9.   

    fp=null;
    fp=fopen(...);
    test it!
      

  10.   

    fp=null我着我试过了,不行啊!真的好烦!
    我干脆把代码贴出来好了!谢谢大家 替我看看!
    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;
    }
      

  11.   

    有一个很显然的错误,把“----------------------------------//到这步就死翘翘了 
        if ((fp=fopen("city_n2.dat","rb")) == NULL) {
            portstr = "没找到用户定义城市名文件(CITY_N2.DAT)! ";
            AfxMessageBox(portstr);
            city_name_user_init_flag = 0;
            return -1;
        } //--------------------------------
    放到end_for:前面去
      

  12.   

    这个老同志的代码显然有危险之处,再说goto最容易导致程序流程不易看懂了
      

  13.   

    如果我猜得不错的话,这肯定是你循环向堆里面写字符造成的溢出的毛病.你的FILE*的指针指向的结构早被破坏了.因而会得到这个bad pointer的古怪毛病.多半在内层循环里,这样调试:
    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);
      

  14.   

    你的代码里对文件格式作了假定:前几个数字表示行的长度(li_length完全可能是天文数字),应当充分考虑到格式的不符造成的影响.另外,你的代码中其它还有几处也有这种不检查溢出错误的毛病(凡是lp_1temp++的地方)都会可能破坏内存,你应当一一加上调试语句.
      

  15.   

    to cpunion(李杰) 
    多谢 问题解决了! 可是这是为什么呢!!!
      

  16.   

    to cpunion(李杰) 
    不好意思 不好意思 我看错了 不能挪 不能挪 一挪地方就不运行我下面的代码了。这个代码不是我写的,其实是人家给我的一个DLL  叫我调用,结果现在害的我要在这里给他改错。烦死了。
      

  17.   

    你最好把goto去掉,改成直接执行的代码,或是改成一个函数
    仔细看看程序流程,程序定义的切入点如你程序中:
    end_for:......get_user:......
    }
    则从end_for:到get_user:之间的都属end_for:内容
    从get_user:到末尾属get_user内容,GOTO语句最好少用
    你改成函数吧解决了后记得加分啊,我的分不多了,以后不能提问了
      

  18.   

    你的主要问题应该在于使用return的地方,全部没有关闭文件句柄,不要几个回合,你系统中的所有的句柄资源都被你用光了!你还打开.....开开什么?把这些改掉,是这里的问题!
      

  19.   

    to cpunion(李杰) 
       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都加上去!!!!!!!
      

  20.   

    还有,return的时候分配好的内存全部释放!!!!
      

  21.   

    我从来没见过会认为不fclose就是解决问题了的结论---悲剧.
      

  22.   

    呵呵,不好意思
    fclose调度的不仅仅是应用程序的资源,还包括操作系统的资源
    你可以编写一个例子试试试试!
    在早期,DOS内核中,使用系统句柄表来控制
    在win内核中将这些改为动态的了,可是这种资源还是有限的!
    不好意思,说多了,和我写的程序一样罗嗦!
      

  23.   

    to 那只兔子
       呵呵,我不知道你是高手,呵呵,
       高明的PRGER从来都不会允许有显而易见的错误存在,因为这些错误可能导致灾难性的错误!
      

  24.   

    fclose(fp);//这步可以运行到,但是返回为-1
        city_name_fixed_length = li_temp;
        city_name_fixed_init_flag = 1;
    可以运行到!!!!
      

  25.   

    不好意思! 现在才给大家回,今天上午才找到是什么错误,说出来大家肯定喷血,
    city_name_fixed = (unsigned char *)_fmalloc((long int)li_length * CITY_NAME_1);
    我们的老同志把的CITY_NAME_1的定义写错了 写成了
    #define  CITY_NAME_1  3+21 //错误:忘了写括号了
    结果分配的内存肯定不够,我和我们的副总天南海北的找了一天半,才发现错在这里了,把我俩给气了个半死。
    说老实话,这个问题只是在一开始学习的时候在书本上看到,自己编程很少碰到,今天算是让我碰到了。
    最后非常非常 感谢大家。这也当是一个小的前车之鉴,大家引以为戒了。
      

  26.   

    怎么不能给分啊! CSDN 老是这样