ASJAN 2022-01-05 19:56 采纳率: 66.7%
浏览 124
已结题

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 00: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);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    CSDN专家-link 2022-01-06 00:29

    fread(&r, sizeof(Data), 1, file_out);你要检查一下返回值是否为0

    回复
    ASJAN 回复 CSDN专家-link 2022-01-06 12:16

    谢谢!已经成功运行!

    回复
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月21日
  • 创建了问题 1月5日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部