C/C++使用变量访问输出文件内容,出现最后一条数据重复输出两次的原因解析,文件问题(2)

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,表示文件末尾,退出循环。由此,最后一条信息输出了两次。

修改后的输出结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lidancsdn/article/details/106788939