楼上两位说的free只适用于链表
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的张家口网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
如果用数组 free不行
你可以用覆盖的方法来删除信息 用一条其他新赋值给要被删除的信息
比如a,b都是结构体变量 要删除a可以这样 a=b;
额。。。我看看。。。
//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)!=0in);i++)
fclose(fp);
//这里思想很简单,就是把 前 0 ~ (i-1)项 和 (i +1)~最后一项 重新写入文件。。。相当于删除了第 i 项。。。
fp=fopen("pil","w+"); //以 “W+"方式打开,你看看规则,
//好像是清除了文件里的信息了吧。。这个不是很清除,不过就逻辑来看,应该就是这样的了。。。
for(j=0;ji;j++)
fwrite(pil[j],sizeof(struct pilot),1,fp);
for(j=i+1;jn;j++)
fwrite(pil[j],sizeof(struct pilot),1,fp);
fseek(fp,0,SEEK_SET);
if(in)
printf("删除成功!");
else
//额。。。这里说一下,你这个 判断应该放在上边我觉得。。。因为如果没找到这个人,那么你应该直接退出,而不是将文件重新写一遍。。浪费时间了。。。
printf("没有此人!");
fclose(fp);
}
struct stTest
{
int a;
int b;
};
stTest a;
memset(a, 0, sizeof(a) ); //从a地址开始清空 sizeof(a)大小的内存
删除列的算法错了,应该紧缩数据把数据按每行col_num数据前移,把空出来的空间放在最后这样计算位置就不会出错了否则总列数并没变,你那个col_num--就会出问题了。行数当然维持不变了!