• 締切済み

複雑なファイルの読み取り

あるファイルからある文字と数字を読み取りたいのですがうまくいきません。 ファイル(例) A01 B02 C03 A02 B01 A03 B03 C05 A04 C04 というファイルを読み込ませ、2行目のようにCがなければ1つ前の行のCをBがなければ1つ前のBをつかうようにしたいのですが、どうしたらいいのかわかりません。 ちなみに初心者ですので本を見ながら下記のようなところまで作ってみました。 データを検索して数値を入力 printf("A,B,Cの順で入力してください(大文字で)--"); gets(search1); gets(search2); gets(search3); while (1){ fseek(fp,RECORDLEN * no++,SEEK_SET); if(fscanf(fp,"%s",b) == EOF) break; if(strstr(b,search1) != NULL){ find++; fscanf(fp,"%s",e); fscanf(fp,"%s",d); printf("A=%s\n",b); printf("B=%s\n",e); printf("C=%s\n",d); } } いまの状態で検索すると最後の行などではBのところにCが入ったりします。どうすればうまくいくでしょうか。どなたか回答のほうをよろしくお願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1の返事が得られないので、適当にサンプルを作ってみました。 ---------------------------------------------------------------- #include <stdio.h> #include <string.h> void main(void){ FILE *fp; char buff[16]; //一行入力バッファ char A[4],B[4],C[4],field[4]; char seach1[8]; char *p; A[0]=B[0]=C[0]='\0'; printf("検索するデータを入力>"); gets(seach1); fp=fopen("data.txt","r"); while(NULL!=fgets(buff, 16, fp)){//ファイルから一行取り込む for(p=buff;p=strtok(p, " \t\n");p=NULL){//データを1つずつ切り出す strcpy(field, p);//切り出すデータをfield にコピー switch(field[0]){//先頭の文字で振り分け case 'A': strcpy(A, field);//AなのでAにコピー break; case 'B': strcpy(B, field); break; case 'C': strcpy(C, field); break; default: fprintf(stderr, "データファイルに想定外のデータがある\n"); } } if(strcmp(A, seach1)==0 || //検索データと一致するか? strcmp(B, seach1)==0 || strcmp(C, seach1)==0 ){ printf("A=%s\n", A);//一致したらA,B,Cを書き出し printf("B=%s\n", B); printf("C=%s\n", C); } } fclose(fp); }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ココで言う、検索とは、 どういう値が入力されて、結果として何を返すという処理なのですか? 1つ前の値を使うというのは、 入力行のデータを調べて、入力が無いとき、前回データを使うというようにして、 現在の入力行の処理が終わったら、現在の入力行のデータを前回データに保存をするというだけで良いと思います。

sugiyosi
質問者

補足

回答おくれましてすみません。ここではAを入力するとその値のある行を読み込み、BやCがなければ前回の値を使うというものです。 投稿していただいたサンプルでもたいへん参考になりました。ありがとうございました。