• ベストアンサー

読込んだファイルの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++

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

chappy-007
質問者

お礼

とても参考になりました! ありがとうございます!

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

入力ファイルとは別に出力ファイルを用意します。 入力ファイルのn行目以外を、出力ファイルに書込むとします。 入力ファイルを1行読むごとに行数をカウントアップします。 行数がnでなかったら、出力ファイルに書込みます。 行数がnだったら、出力ファイルに書込みません。 この処理を、入力ファイルが尽きるまで繰り返せば、 出力ファイルの中身はお望みどおりとなることでしょう。

関連するQ&A