用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判断到达结尾,退出循环,顺序执行。
经过修改,可以正常读取了。
- 用feof()判断文件时出现多读内容的问题
- 用feof()判断文件时出现多读内容的问题
- C 库函数 feof(FILE*) 判断文件末尾的问题
- c语言 判断文件结束问题 feof()
- 怎样解决使用feof()函数时出现的问题?
- feof多读一次数据的问题
- feof 作为循环判断条件的问题
- 关于C语言feof()函数判断文件结尾的问题分析
- 文件结尾判断feof , EOF
- 判断文件结束的两种方法: EOF和feof()
- 判断文件结尾的方法(feof函数和EOF)
- PHP feof() 函数读文件的使用
- feof多读一次问题分析
- fread feof 文件尾读取重复的问题
- 有关使用feof()函数问题出现?问题
- 判断文件结束函数(feof)
- fgets与feof 判断文件结尾
- feof()多读一次的解决方法
- 20170927
- Apache Spark 2.2.0 中文文档
- Spring+Quartz实现定时任务的配置方法
- Bootstrap之使用面板
- 使用ffmpeg的lib库解码H264/H265
- 用feof()判断文件时出现多读内容的问题
- ES6解构和扩展运算符
- 基于Nginx的负载均衡网站架构
- [转]moveToThread
- Java学习中,对登陆的总结。
- (转载)maven搭建ssm分模块框架 (myeclipse版) (二) 较详细版
- JNI开发
- 通过acpi_device_hid 得到device的HID
- BZOJ 4140: 共点圆加强版 [二进制分组]