关于fread读取数据时指针的位置问题

关于fread读取数据时指针的位置问题,第1张

这个r我一般是用来检测文件的,fread这个函数的返回值就是它读取了几次的值,在你这里fread返回值为1,所以r的值应该是1,如果r值为0,那么就代表读取错误,一般来说就是文件读取完了。可以把r=fread(&dat, sizeof(dat), 1, f)作为if语句括号内的表达式。我习惯用这种方式来检测文件指针是否到了文件末尾。

最后一条数据输出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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7430510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存