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

通过网上查阅资料,我大概知道应该是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);
    }
}

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