c语言feof()函数出错,文件结束了feof函数不返回1,而是再读一次以后才会返回1

本人正在用c语言去写代码,读写文件的时候遇到了问题。文件写入n段数据,会读出n+1段数据,多出来的那段数据是跟第n个数据一模一样。测试很多次,发现问题出在循环条件会多走一趟。
数据结构:

typedef struct Data
{
    char                cName[9];
    char                cSex[3];
    char                sNum[10];
    char                pNum[12];
}Data;

写文件:

void write()
{
    Data    r;
    FILE* file_in;
    char    Name[9];
    char    Sex[3];
    char    Num_s[10];
    char    Num_p[12];
    file_in = fopen("data.dat", "ab");//空文件的时候是wb,现在追加ab;
    if (file_in == NULL)
    {
        printf("打开文件失败!\n");
        exit(-1);
    }
    printf("姓名:");
    scanf("%s", Name);
    strcpy(r.cName, Name);
    printf("性别:");
    scanf("%s", Sex);
    strcpy(r.cSex, Sex);
    printf("学号:");
    scanf("%s", Num_s);
    strcpy(r.sNum, Num_s);
    printf("联系电话:");
    scanf("%s", Num_p);
    strcpy(r.pNum, Num_p);
    fwrite(&r, sizeof(Data), 1 , file_in);
    fclose(file_in);
}

读文件:

void read()
{
    FILE* file_out;
    Data    r;
    file_out = fopen("data.dat", "rb");
    if (file_out == NULL)
    {
        printf("打开文件失败!\n");
        exit(-1);
    }
    while (!feof(file_out))
    {
        fread(&r, sizeof(Data), 1, file_out);
        printf("%s\n%s\n%s\n%s\n", r.cName, r.cSex, r.sNum, r.pNum);
    }
    fclose(file_out);
}

主函数:

int main()
{
    write();
    read();
    retrun 0;
} 

先从空文件开始,添加一个数据,运行的结果:

img

我添加一个数据

img

我再添加一个数据

img

就是最后一个数据会重复!
难道文件结束了,feof函数有延迟了吗?还是我写的代码有问题?
文件到尾了feof函数返回0(未结束),下一次才返回1(结束),无论有多少个数据,文件结束了都会多读一遍,而且读的是最后一个数据
谁能帮我看看哪里出了问题,怎么解决?

int n= fread(&r, sizeof(Data), 1, file_out);
while (n!=0)
    {
       
        printf("%s\n%s\n%s\n%s\n", r.cName, r.cSex, r.sNum, r.pNum);
        n= fread(&r, sizeof(Data), 1, file_out);
    }

或者

int n=0;
 while (!feof(file_out))
    {
        n = fread(&r, sizeof(Data), 1, file_out);
        if(n>0)
              printf("%s\n%s\n%s\n%s\n", r.cName, r.cSex, r.sNum, r.pNum);
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632