求助C語言請問要如何刪除二進位檔案裡的資料內容? |
答題得分者是:ikk
|
azure532
一般會員 ![]() ![]() 發表:1 回覆:1 積分:0 註冊:2008-05-27 發送簡訊給我 |
各位大大您好:
這是小弟我寫的程式 這個程式首先先讀取了store.txt 裡面的內容為A1 A2 A3 A4 再來good.bin為二進位檔案 這個假設裡面有五筆資料 我要刪除其中第三筆 而最後兩筆依序往上補 我該如何做呢?我想了很久還是不知道該如何去做 麻煩各位先進前輩們指點迷津 [code cpp] 請在此區域輸入程式碼 #include #include 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 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: //goods.position=*(s1 0); strcpy(goods.position,*(s1 0)); break; case 1: strcpy(goods.position,*(s1 1)); //goods.position=*(s1 1); break; case 2: strcpy(goods.position,*(s1 2)); //goods.position=*(s1 2); break; case 3: strcpy(goods.position,*(s1 3)); //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) { //puts("find your search"); 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) { //puts("not search"); 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) { printf("delete SN:"); fflush(stdin); scanf("%d",&cmp); for(i=0;i<100;i ) { numread=fread(&goods,sizeof(STORE),1,fp); if(numread==0) { puts("not delete"); break; } if((fseek(fp,sizeof(STORE),SEEK_SET))!=0) { puts("456"); perror("fseek failed"); } if(goods.sn==cmp) { //fseek(fp,sizeof(STORE),SEEK_CUR); puts("123"); fflush(stdin); break; } } } else { puts("error7"); } fclose(fp); break; case 5: exit(1); break; default: puts("not choose input again"); break; } } free(s); free(s1); return 0; } [/code] 編輯記錄
azure532 重新編輯於 2009-03-24 17:36:00, 註解 無‧
|
azure532
一般會員 ![]() ![]() 發表:1 回覆:1 積分:0 註冊:2008-05-27 發送簡訊給我 |
我的case 4:刪除這個動作我不知道該如何下手 從哪個方向去做~~ 請板上的各位前輩們幫忙小弟的問題謝謝
程式碼: http://pk168.myweb.hinet.net/mygoods.rar |
ikk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |