[問題] C語言求助請問要如何刪除二進位檔案裡的資料內容?
這是小弟我寫的程式 這個程式首先先讀取了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
→
03/24 17:41, , 1F
03/24 17:41, 1F
→
03/24 17:47, , 2F
03/24 17:47, 2F
→
03/24 17:48, , 3F
03/24 17:48, 3F
→
03/24 17:49, , 4F
03/24 17:49, 4F
推
03/24 21:24, , 5F
03/24 21:24, 5F
→
03/24 21:24, , 6F
03/24 21:24, 6F
→
03/25 11:26, , 7F
03/25 11:26, 7F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章