解释一段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);
}
请帮忙解释一下是如何删除的! 展开
{ 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);
}
请帮忙解释一下是如何删除的! 展开
2个回答
展开全部
额。。。我看看。。。
//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);
}
//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);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询