[問題] C語言求助請問要如何刪除二進位檔案裡的資料內容?

看板C_and_CPP (C/C++)作者 (當紅炸子機羅密歐)時間16年前 (2009/03/24 16:52), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串1/1
這是小弟我寫的程式 這個程式首先先讀取了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: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
tsaiminghan謝謝你的指點
03/25 11:26, 7F
文章代碼(AID): #19o9zaoI (C_and_CPP)
文章代碼(AID): #19o9zaoI (C_and_CPP)