解释一段C语言程序删除结构体中的一个元素

voiddele_name(){FILE*fp;inti,j,n;charname[10];if((fp=fopen("pil","rb"))==NULL){printf... void dele_name()
{ FILE *fp;
int i,j,n;
char name[10];
if((fp=fopen("pil","rb"))==NULL){printf("不能打开pil文件\n"); exit(1);}
printf("删除前\n");
printf("记录号: 入住时间 房间号 姓名 性别 床位数 费用 身份证号<Enter>\n");
for(n=0;fread(&pil[n],sizeof(struct pilot),1,fp);n++)
printf("%6d%10s%7s%7s%7s%7d%9d%20s\n",n+1,pil[n].time,pil[n].no,pil[n].name,
pil[n].sex,pil[n].shu,pil[n].money,pil[n].id);
printf("要删除的旅客姓名:");scanf("%s",name);
for(i=0;(strcmp(pil[i].name,name)!=0&&i<n);i++)
fclose(fp);
fp=fopen("pil","w+");
for(j=0;j<i;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
for(j=i+1;j<n;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
fseek(fp,0,SEEK_SET);
if(i<n)
printf("删除成功!");
else
printf("没有此人!");
fclose(fp);
}
请帮忙解释一下是如何删除的!
展开
 我来答
sx_liang
2010-11-12 · TA获得超过214个赞
知道小有建树答主
回答量:233
采纳率:0%
帮助的人:194万
展开全部
额。。。我看看。。。

//pil[n] 首先这个数组没有定义。。。。你先看看,是用它来记录文件信息的。。。你定义的应该是个全局变量吧??

void dele_name()
{ FILE *fp;
int i,j,n;
char name[10];
if((fp=fopen("pil","rb"))==NULL){printf("不能打开pil文件\n"); exit(1);}
printf("删除前\n");
printf("记录号: 入住时间 房间号 姓名 性别 床位数 费用 身份证号<Enter>\n");

//将所有的信息“ 都 “写入了pil[n] 数组;都写入了你看到没??

for(n=0;fread(&pil[n],sizeof(struct pilot),1,fp);n++)
printf("%6d%10s%7s%7s%7s%7d%9d%20s\n",n+1,pil[n].time,pil[n].no,pil[n].name,
pil[n].sex,pil[n].shu,pil[n].money,pil[n].id);
printf("要删除的旅客姓名:");scanf("%s",name);
//额。。。。这个for的空循环,通过strcmp(pil[i].name,name来寻找
//要删除的人的信息;如果找到了,就退出,但是此时记录了该项在pil[n]的下标值,即就是该元组是文件里的第 i 项;是个关键;
for(i=0;(strcmp(pil[i].name,name)!=0&&i<n);i++)

fclose(fp);
//这里思想很简单,就是把 前 0 ~ (i-1)项 和 (i +1)~最后一项 重新写入文件。。。相当于删除了第 i 项。。。
fp=fopen("pil","w+"); //以 “W+"方式打开,你看看规则,
//好像是清除了文件里的信息了吧。。这个不是很清除,不过就逻辑来看,应该就是这样的了。。。
for(j=0;j<i;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
for(j=i+1;j<n;j++)
fwrite(&pil[j],sizeof(struct pilot),1,fp);
fseek(fp,0,SEEK_SET);
if(i<n)
printf("删除成功!");
else

//额。。。这里说一下,你这个 判断应该放在上边我觉得。。。因为如果没找到这个人,那么你应该直接退出,而不是将文件重新写一遍。。浪费时间了。。。
printf("没有此人!");
fclose(fp);
}
阿四哥vlog
2021-05-24 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:607
采纳率:0%
帮助的人:27.2万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式