请教各位,我正在做一个学生成绩管理程序,但是在删除学生这部分没有办法删除数据,我的要求是按按学号删除学生成绩,但是每次输入学号,就会说“无法打开文件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();
}
if((fp=fopen("stud.rec","rb"))==NULL);
这一行末尾的分号会导致无论文件是否成功打开,都执行下一行的打印错误信息和退出操作。去掉分号这样:if((fp=fopen("stud.rec","rb"))==NULL)
读取了数据并检查了学生编号,但是在找到匹配的学号并打印了信息后,没有任何操作来实际删除该学生。你要在内存中删除该学生记录,然后在写入文件之前,不要写入该记录。
你打开文件以写入时使用了 "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();
}
这段代码的逻辑是先读取所有的数据并在内
不知道你这个问题是否已经解决, 如果还没有解决的话:代码中并没有涉及到学生成绩管理程序的删除数据相关的部分,因此无法针对优化后的问题给出具体解决方案。建议重新描述原问题并提供相应的代码,或检查代码是否存在错误和缺陷,以便更好地解决该问题。