- ベストアンサー
読込んだファイルの1行分削除したい
氏名A 年齢 性別 出身 氏名B 年齢 性別 出身 氏名C 年齢 性別 出身 : : というような内容のファイルを読込み、 指定した氏名の行(レコード)を全部削除するには、 どのような方法があるでしょう? /* ここから */ FILE *fp; char NAME[20]; /* 氏名 */ char AGE[3]; /* 年齢 */ char SEX[8]; /* 性別 */ char FROM[15]; /* 出身 */ char de][20]; /* 削除する氏名のレコード */ fp = fopen(FNAME, "r+"); if (fp == NULL) { __fprintf(stderr, "次のファイルが開けません: %s\n", FNAME); __return -1; } printf("削除するデータの氏名: "); gets(del); /* 検索氏名取得 */ /* ここまで */ ここまで考えたのですが、この後どうしていいのか分かりません。 環境 WinXP / Borland C++
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
作業ファイルを作って、氏名を比較しながら書き出しましょう。 こんな感じ? #include <stdio.h> #include <string.h> /* strcmp用 */ #define FNAME "list.txt" #define FTEMP "temp.txt" int main(void) { FILE *fin, *fout; char name[20],age[3],sex[8],from[15]; /* 氏名、年齢、性別、出身 */ char del[20]; /* 削除する氏名のレコード */ char buf[100]; /* 1レコード分の作業エリア */ /* データファイルを開く */ if ((fin = fopen(FNAME, "r"))==NULL) { fprintf(stderr, "次のファイルが開けません: %s\n", FNAME); return -1; } /* 作業ファイルを開く */ if ((fout = fopen(FTEMP, "w"))==NULL) { fprintf(stderr,"作業用ファイルが開けません:%s\n",FTEMP); return -1; } /* 検索氏名取得 */ printf("削除するデータの氏名: "); gets(del); /* 指定の氏名以外を作業ファイルに書き出す */ while(fgets(buf,sizeof(buf),fin)!=NULL) { sscanf(buf,"%s%s%s%s",name,age,sex,from); if (strcmp(name,del)!=0) { fputs(buf,fout); } } /* ファイルを閉じる */ fclose(fin); fclose(fout); /* 作業ファイルをデータファイルに上書きする */ if (remove(FNAME)!=0) { fprintf(stderr,"削除失敗:%s\n",FNAME); return -1; } if (rename(FTEMP, FNAME)!=0) { fprintf(stderr,"改名失敗:%s %s\n",FNAME, FTEMP); return -1; } /* 終わり */ return 0; }
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
入力ファイルとは別に出力ファイルを用意します。 入力ファイルのn行目以外を、出力ファイルに書込むとします。 入力ファイルを1行読むごとに行数をカウントアップします。 行数がnでなかったら、出力ファイルに書込みます。 行数がnだったら、出力ファイルに書込みません。 この処理を、入力ファイルが尽きるまで繰り返せば、 出力ファイルの中身はお望みどおりとなることでしょう。
お礼
とても参考になりました! ありがとうございます!