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

fread(...);//读文件数据while(!cfptr)//cfptr文件指针{printf("...");//输出数据到屏幕fread(....);//读文件数据... fread(...); //读文件数据
while(!cfptr) //cfptr文件指针
{
printf("..."); //输出数据到屏幕
fread(....); //读文件数据
}

上面几条代码换成以下代码就无法输出文件里最后一条数据了
while(!cfptr) //cfptr文件指针
{
fread(....); //读文件数据
printf("..."); //输出数据到屏幕
}
这部分代码我在cfree上运行过,没错误的啊,只不过用后一部分代码无法输出文件里面最后一条数据。
r = fread(&dat, sizeof(dat), 1, f);fread函数读取的数据不是放到&dat这个地址上了吗,这个 r 有什么用呢?

不用r去接受fread的返回值也可以正确运行的啊,我现在搞不懂的是我上面的两部分代码输出结果为什么会不一样,一个能正确输出,一个也能全部输出,但最后一条数据重复输出了2次
展开
 我来答
kj1056564568
推荐于2016-01-07 · TA获得超过110个赞
知道答主
回答量:152
采纳率:50%
帮助的人:98.2万
展开全部
这个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次。
enochwills
2010-07-10 · TA获得超过4793个赞
知道大有可为答主
回答量:2031
采纳率:96%
帮助的人:1611万
展开全部
上面写得都不对,正确写法是:
struct MyData{
...
};
int r = 0; struct MyData dat;
FILE * f = fopen("abc.txt", "rb");
if(!f) return 0;
while(!feof(f)) {
r = fread(&dat, sizeof(dat), 1, f);
if(r < 1 ) break;
printf(....);
}//end while
fclose(f);
注意,需要培让轿检测fread()的配肆返回值,同时循环的时候要检测滑搏文件是否结束feof()!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式