ASJAN 2022-01-06 03:56 采纳率: 66.7%
浏览 117
已结题

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(结束),无论有多少个数据,文件结束了都会多读一遍,而且读的是最后一个数据
谁能帮我看看哪里出了问题,怎么解决?

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-01-06 08:25
    关注
    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);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 1月6日

悬赏问题

  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目