水而寒 2019-08-01 16:17 采纳率: 72.7%
浏览 1080

为什么读文件最后一行内容会重复输出两次

通过网上查阅资料,我大概知道应该是feof函数这里出了问题,可是就算feof函数是先读再返回文件状态,假如我输入前3组数据,最后多输出的不也应该是EOF符,格式化输出的话最后一行不应该是乱码才对吗?或者多输出一次最后一项的内容,而最后一项的内容是初始值{0,"",0.0}(文件创建初始100组数据都是初始值),if函数限制该项不被输出,为什么还是会输出4组数据(第三组被输出了两次)?我知道应该如何修改,应该把fread函数放在feof函数之前,可是我不理解多输出一次的原因是什么,为什么呢?希望帮忙解答一下,谢谢!

#include <stdio.h>
struct bankclient
{
    int count;
    char name[10];
    float money;
};
void main()
{
    int i,record_len;
    struct bankclient client={0,"",0.0};
    FILE *fp;
    record_len=sizeof (struct bankclient);
    if ((fp=fopen("credit.dat","w"))==NULL)
        printf("FILE OPEN ERROR\n");
    else
    {
        for (i=1;i<=100;i++)
            fwrite(&client,record_len,1,fp);
        fclose(fp);
        printf("完成\n");
    }
}

文件内容输入和输出:

#include <stdio.h>
struct bankclient
{
    int count;
    char name[10];
    float money;
};
void main()
{
    int record_len;
    struct bankclient client;
    FILE *fp;
    record_len=sizeof(struct bankclient);
//随机写文件
    if ((fp=fopen("credit.dat","r+"))==NULL)
        printf("账户文件credit.dat不存在,请先建立该文件!\n");
    else
    {
        printf("请按顺序输入账号、姓名和账户资金\n");
        printf("当输入账号为0时输入结束\n");
        printf("-------------------------------------\n");
        printf("请输入账号:");
        scanf("%d",&client.count);
        getchar();
        while (client.count!=0) //当输入账号为0时输入结束
        {
            printf("请输入户名:");
            gets(client.name);
            printf("请输入账户资金:");
            scanf("%f",&client.money);
            //getchar();
            fseek(fp,(client.count-1)*record_len,0);
            fwrite(&client,record_len,1,fp); //将内容写到文件的指定位置
            printf("请输入账号:");
            scanf("%d",&client.count);
            getchar();
        }
        rewind(fp);
        printf("账户信息如下:\n");
        printf("-----------------------------------\n");
        printf("%5s%8s%10s\n","账号","姓名","金额");
//显示文件中所有的记录
        while (!feof(fp))
        {
            fread(&client,record_len,1,fp);
            if (client.count!=0)
                printf("%5d%10s%8.2f\n",client.count,client.name,client.money);
        }
        fclose(fp);
    }
}
  • 写回答

1条回答 默认 最新

  • lognethinker 2019-08-02 17:49
    关注

    你以为eof函数是最后一行为true,但事实上是读取内容为"空"(最后一行的下一行)时,才为true

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名