用feof()判断文件时出现多读内容的问题

昨天将自己以前做的电子通讯录加上了文件读写的功能,是的数据可以关机保存,开机读取。

在修改的过程中出现了一个问题就是每次开启程序时,读文件内的内容总是会在最后多读一串数据,经过上网查询找到了问题所在。

下面我先把我原来写的错误的程序部分贴出

while(0 == feof(stream)) 
{
fread(&from,sizeof(struct file_node),1,stream);

Dlink p;
p = (Dlink)malloc(sizeof(Node));

strcpy(p->name,from.name);
strcpy(p->phone_number,from.phone_number);
strcpy(p->home_address,from.home_address);
strcpy(p->com_number,from.com_number);
insert_node(p,q);
q = q->next;
}

这里我是先用feof()判断文件指针有没有到结尾,再读取数据,再写到我创建的结构体中,按理说着没有什么逻辑错误,但是结果却是结尾多读了一次,最后一个结构体读了两次。


查询feof()的性质我发现

只有当文件位置指针到了文件末尾,再发生读/写操作,然后再调用feof(),才会得到文件结束的信息。也就是说feof()是要先读过才可以判断是否到了文件尾。这是一个常见的错误,很容易犯。

按照这样我修改了我的程序,下面贴出

fread(&from,sizeof(struct file_node),1,stream);
while(0 == feof(stream)) 
{
Dlink p;

p = (Dlink)malloc(sizeof(Node));

strcpy(p->name,from.name);
strcpy(p->phone_number,from.phone_number);
strcpy(p->home_address,from.home_address);
strcpy(p->com_number,from.com_number);
insert_node(p,q);
q = q->next;

fread(&from,sizeof(struct file_node),1,stream);
}

这里我是先在while()循环体上面先用fread读一次,再开始执行while(),在while()循环体中我将以前第一句的fread()语句删除,直接开始拷贝数据,在循环体结尾,我用了一次fread(),这样就做到了先读写再判断。当拷贝完最后一个结构体后,fread一次,文件到达结尾,feof判断到达结尾,退出循环,顺序执行。


经过修改,可以正常读取了。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值