c语言写学生成绩管理程序,delete部分数据无法删除,想知道怎么修改

请教各位,我正在做一个学生成绩管理程序,但是在删除学生这部分没有办法删除数据,我的要求是按按学号删除学生成绩,但是每次输入学号,就会说“无法打开文件stud.rec",想知道我哪里有问题,怎么修改,我的代码如下

void deletestu()
{
    struct student stud[N],z;
    int k=0,y=0;
    char x[10];
    FILE *fp;
    printf("\n\n\n请输入要删除的学号:");
    gets(x);
    if((fp=fopen("stud.rec","rb"))==NULL);
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);    
    }
    printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
    while (fread(&stud[k],sizeof(stud[k]),1,fp)==1)
    {
        if(strcmp(stud[k].num,x)==0) {y=1;printf("%-10s%-10s%-10s%-10.1f\n",stud[k].num,stud[k].name,stud[k].sex,stud[k].score);}
        else k=k+1;
    }
        fclose(fp);
        
        if(y==0) printf("\n\n查无此学号!!");
        else
        {
            if ((fp=fopen("stud.rec","wb"))==NULL)
            {
                printf("无法创建文件!\n");
                exit(0);
            }
            for(y=0;y<k;y++)
                fwrite(&stud[y],sizeof(stud[y]),1,fp);
            fclose(fp);
        }
            printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
}

TechWhizKid参考GPT回答:

  1. if((fp=fopen("stud.rec","rb"))==NULL); 这一行末尾的分号会导致无论文件是否成功打开,都执行下一行的打印错误信息和退出操作。去掉分号这样:if((fp=fopen("stud.rec","rb"))==NULL)

  2. 读取了数据并检查了学生编号,但是在找到匹配的学号并打印了信息后,没有任何操作来实际删除该学生。你要在内存中删除该学生记录,然后在写入文件之前,不要写入该记录。

  3. 你打开文件以写入时使用了 "wb" 模式,这将清空文件并开始新的写入。如果你只希望删除一个学生,那么你可能会删除其他学生的记录。

下面是修正后的代码:

void deletestu()
{
    struct student stud[N];
    int k=0, y=0, delIndex = -1;
    char x[10];
    FILE *fp;
    printf("\n\n\n请输入要删除的学号:");
    gets(x);
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);    
    }
    printf("\n\n%-10s%-10s%-10s%-10s\n","学号","姓名","性别","成绩");
    while (fread(&stud[k],sizeof(stud[k]),1,fp)==1)
    {
        if(strcmp(stud[k].num,x)==0) 
        {
            y=1;
            printf("%-10s%-10s%-10s%-10.1f\n",stud[k].num,stud[k].name,stud[k].sex,stud[k].score);
            delIndex = k;
        }
        k++;
    }
    fclose(fp);

    if(y==0) 
    {
        printf("\n\n查无此学号!!");
    }
    else
    {
        if ((fp=fopen("stud.rec","wb"))==NULL)
        {
            printf("无法创建文件!\n");
            exit(0);
        }
        for(y=0;y<k;y++)
        {
            if (y != delIndex)
            {
                fwrite(&stud[y],sizeof(stud[y]),1,fp);
            }
        }
        fclose(fp);
    }
    printf("\n\n\n按任意键返回主菜单。。。。。。");
    getchar(); 
}

这段代码的逻辑是先读取所有的数据并在内

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    代码中并没有涉及到学生成绩管理程序的删除数据相关的部分,因此无法针对优化后的问题给出具体解决方案。建议重新描述原问题并提供相应的代码,或检查代码是否存在错误和缺陷,以便更好地解决该问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^