最后一条数据输出2次这个问题我也遇到过,是检测文件是否到末尾的问题,我用while(!feof(fp))就会出现这种问题,应该是判断文件指针是否到文件末尾出现错误了,具体原因我也不清楚,不过很容易解决,就是利用类似楼上的r的方式。
while(1)
{
if(fread(&A,sizeof(struct employee),1,fp)!=1)
break
}
直接用fread的返回值判断比较准确,用判断指针的方式有问题。
文件指针是移动一个字节再读取一个字节,当读取完一个结构体之后,文件指针指向该结构体最后一个字节,只有进行下次读取时,文件指针才会移动,所以当读取完文件中最后一个结构体,文件指针指向的是最后一个结构体的最后一个字节,而不是文件末尾——这就像字符数组,最后一个字母不是末尾,末尾是\0。所以读取完文件中最后一个结构体后,文件指针去没有移动到文件末尾。这样while的循环体就要多执行一次。
你问为什么上面2部分代码输出结果不一样,那是因为printf的位置不一样。while的循环体会多执行一次,在这一次中fread是不能正确读取数据的——因为文件指针的位置,所以printf函数输出的就是内存中原有的结构体,即文件中的最后一个结构体。你上面那个函数printf在fread前面,即先输出然后再读取下一次的,这样就避免了出错。你下面那个呢?先读取再输出,这样问题就来了,读取出错,但是输出可没出错,所以就把内存中数据给输出了,所以最后一条数据输出了2次。
fread函数会改变 文件指针地址,你的程序,每读1个 unsigned char, 文件指针就指向 下 一个字节。不信,你可以用 fgetpos (fpin,&pos) 获得当前文件指针位置pos 来检查。
前面声明过变量 fpos_t pos
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)