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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装