C/C++用变量访问输出文件,出现最后一条数据重复输出两次的原因解析
注:以下储存文件信息的变量,举例为已声明的结构体变量
在用C/C++编写代码的时候,我们通常会使用结构体来读写文件信息,在输出的过程中我们有可能出现,最后一条信息输出两次????
一般我们都是这么写的:
while(!feof(fp))
{
fread(&str,sizeof(yh),1,fp);//读出文件信息
printf("\t\t\t\t%-15s%-13s%15s%16d%15c%20s\n\n",str.zhanghao,s tr.mima,str.tel,str.BuySum,str.tol,str.time); //输出信息
}
fclose(fp);
结果如图所示:
可见,最后一条信息多输出了一次,但是查看文件中,有、又确实只有一条消息,但其实问题不在文件上,而是在结构体变量和feof函数上,因此,我们可如此修改:
while(!feof(fp))
{
if(fread(&str,sizeof(yh),1,fp))
printf("\t\t\t\t%-15s%-13s%15s%16d%15c%20s\n\n",str.zhanghao,str.mima,str.tel,str.BuySum,str.tol,str.time);
else
break;
}
解决:在读出函数加个if判断
原因:feof函数是判断文件是否被访问到最后,但是这个最后其实指的是,读完最后一条信息的那个位置的后面是否还有值,也就是说,最后一条信息读完以后,指针自动后移,文件指针已经到达文件末尾,但是feof判断不出来,所以,他还要循环一次,执行fread,但是读取失败,可结构体变量里面还保存着上一次(最后一条)读出的信息,然后输出,再回到循环判断feof,这次他才返回1/true,表示文件末尾,退出循环。由此,最后一条信息输出了两次。
修改后的输出结果如下: