作者azure532 (当红炸子机罗密欧)
看板C_and_CPP
标题[问题] C语言求助请问要如何删除二进位档案里的资料内容?
时间Tue Mar 24 16:52:51 2009
这是小弟我写的程式 这个程式首先先读取了store.txt 里面的内容为A1
A2
A3
A4
再来good.bin为二进位档案 这个假设里面有五笔资料 我要删除其中第三笔 而最後两笔
依序往上补 我该如何做呢?我想了很久还是不知道该如何去做 麻烦各位先进前辈们指点
迷津
#include <stdio.h>
#include <string.h>
typedef struct
{
int sn;
char name[10];
char position[10];
}STORE;
STORE goods;
int main(void)
{
FILE *fp,*fptr;
char *s=(char *)calloc(10,sizeof(char));
char **s1,*sss;//用来存store.txt档案
int base;//选择要做哪个动作
int idx=0;//用来当1.A1 2.B2的索引值
int i;
int m;//用来做动态第一维元素的大小
int num;//用来选择1=A1 2=A2的
int cmp;//比较sn是否相同
int numread;
if((fp=fopen("store.txt","r"))!=NULL)
{
while((fgets(s,10,fp))!=NULL)
{
i++;
}
}
else
{
printf("error");
}
fclose(fp);
m=i;
s1=(char **)calloc(m,sizeof(char *)+(m*4,sizeof(char)));
for(i=0,sss=(char *)(s1+m);i<m;i++,sss+=4)
{
s1[i]=sss;
}
while(1)
{
printf("**********\n");
printf("1.store in\n");
printf("2.search\n");
printf("3.display all\n");
printf("4.delete\n");
printf("5.exit\n");
printf("**********\n");
scanf("%d",&base);
switch(base)
{
case 1:
if((fp=fopen("goods.bin","a+b"))!=NULL)
{
printf("SN:");
fflush(stdin);
scanf("%d",&goods.sn);
printf("NAME:");
fflush(stdin);
scanf("%s",goods.name);
printf("position:(");
fflush(stdin);
if((fptr=fopen("store.txt","r"))!=NULL)
{
while((fgets(s,10,fptr))!=NULL)
{
strtok(s,"\r\n");
s1[idx]=s;
printf("%d.%s:",idx,s1[idx]);
idx++;
if(idx==4)
idx=0;
s=(char *)calloc(10,sizeof(char));
}
printf(")");
}
else
{
puts("error");
}
scanf("%d",&num);
fflush(stdin);
switch(num)
{
case 0:
strcpy(goods.position,*(s1+0));
break;
case 1:
strcpy(goods.position,*(s1+1));
break;
case 2:
strcpy(goods.position,*(s1+2));
break;
case 3:
strcpy(goods.position,*(s1+3));
break;
}
printf("%d:%s:%s\n",goods.sn,goods.name,goods.position);
fwrite(&goods,sizeof(STORE),1,fp);
}
else
{
puts("error");
}
fclose(fp);
fclose(fptr);
break;
case 2:
if((fp=fopen("goods.bin","rb"))!=NULL)
{
printf("search SN:");
fflush(stdin);
scanf("%d",&cmp);
for(i=0;i<100;i++)
{
numread=fread(&goods,sizeof(STORE),1,fp);
if(numread==0)
{
puts("not search");
break;
}
if(goods.sn==cmp)
{
printf("SN:%d\n",goods.sn);
printf("Name:%s\n",goods.name);
printf("location:%s\n",goods.position);
break;
}
}
}
else
{
puts("error4");
}
fclose(fp);
break;
case 3:
if((fp=fopen("goods.bin","rb"))!=NULL)
{
for(i=0;i<100;i++)
{
numread=fread(&goods,sizeof(STORE),1,fp);
if(numread==0)
{
break;
}
printf("SN:%d\t",goods.sn);
printf("Name:%s\t",goods.name);
printf("location:%s\n",goods.position);
}
}
else
{
puts("error5");
}
fclose(fp);
break;
case 4:
if((fp=fopen("goods.bin","rb"))!=NULL)
{
}
else
{
puts("error7");
}
fclose(fp);
break;
case 5:
exit(1);
break;
default:
puts("not choose input again");
break;
}
}
free(s);
free(s1);
return 0;
}
抱歉程式很长~~请见谅
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.20.115.210
1F:→ james732:程式长不是问题 排版一下吧... 03/24 17:41
2F:→ azure532:抱歉没有排版 03/24 17:47
4F:→ azure532:附上原始档案程式码 03/24 17:49
5F:推 tsaiminghan:之前听别人说只能建新档,再把旧档删掉 03/24 21:24
6F:→ tsaiminghan:然後改档名 03/24 21:24
7F:→ azure532:tsaiminghan谢谢你的指点 03/25 11:26