用c写了一段读文件的代码。文件中数据量已知,每条记录按固定字节数存储,在读到第三条(反正前几条)时文件指针就变成了一个无效值。由于不太方便贴出代码,但是大致如下:
int readfile() { FILE*fp; int k = 0; char buff[1024]={0}; fp = fopen("filename","r"); if(fp==NULL) return 0; while(k<10 && !feof(fp)) //这里由于记录条数是已知,本人这里就直接写成10 { fread(buff,1023,1,fp); //这里有一些无关fp 和k 的处理代码 k++; } fclose(fp); fp = NULL; return 0; }
问题:在读入前几条后,出现段错误,通过core文件发现是fclose关闭的文件指针有问题。
通过gdb 调试,发现在读前几条数据后,上面k 突然变成一个很大的值(8位数,看上去像一个地址),fp指针变成了和刚开始打开文件不一样的地址,变成了一个无效地址,导致fclose失败,段错误。(注:不存在多线程,打开的文件不存在在读取时候被删除的情况)
不知道大家有没有遇到这种情况,以前没遇到过这种问题,不知道大家有什么解决办法?多谢了![/size]
解决方案
15
估计是向数组写入数据时越界了。
用GDB 设置一个watch point 监视fp,这样一旦fp被改变便可以断下来看是哪里出了问题
用GDB 设置一个watch point 监视fp,这样一旦fp被改变便可以断下来看是哪里出了问题
30
你这个肯定是有变量越界了,覆盖到k变量甚至是fp文件指针所在的内存。
极有可能是你fread(buff,1023,1,fp);后面的语句造成的,建议题主本人检查下,或贴出来。
极有可能是你fread(buff,1023,1,fp);后面的语句造成的,建议题主本人检查下,或贴出来。
20
越界不一定是fread那句导致的,也可能是你的别的变量越界导致的
你可以把别的语句都注释掉,就光光fread,然后fclose看看有没有问题
你可以把别的语句都注释掉,就光光fread,然后fclose看看有没有问题