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

来源:互联网 发布:手机淘宝如何上传视频 编辑:程序博客网 时间:2024/05/29 12:22

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

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

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

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判断到达结尾,退出循环,顺序执行。


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

原创粉丝点击