• 締切済み

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

あるファイルからある文字と数字を読み取りたいのですがうまくいきません。 ファイル(例) 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がなければ前回の値を使うというものです。 投稿していただいたサンプルでもたいへん参考になりました。ありがとうございました。

関連するQ&A

  • 出力内容を新しいテキストファイルで保存するには?

    プログラム #include <stdio.h> #include <string.h> main() { char text[100]; char a[20], b[20], c[20], d[20], e[20], f[20]; char fname[20]; int i = 1; FILE *fp; printf("■ファイル名>>"); scanf("%s",fname); fp=fopen(fname,"r"); if((fp = fopen(fname,"r")) == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } else{ printf("ファイルをオープンしました。\n"); } while( fscanf(fp, "%s", text) != EOF){ sscanf(text, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^\0]", a, b, c ,d, e, f); printf("%d回目\n",i++); printf("全文:%s\n",text); printf("1つ目:%s\n",a); printf("2つ目:%s\n",b); printf("3つ目:%s\n",c); printf("4つ目:%s\n",d); printf("5つ目:%s\n",e); printf("6つ目:%s\n\n",f); } } テキストファイル ABCD,EFGH,IJKL,MNOP,QRST,UVWXWZ abcd,efgh,ijkl,mnop,qrst,uvwxyz あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの,はひふへほ テキストファイルから文字列を読み込み、変換させて出力させた内容を他のテキストファイルに保存するにはどのようにしたらいいのでしょうか?

  • 再検索プログラムについて

    再びすみません。 先ほどは別の問題で質問させていただきました。 今回は、address2.txtに保存してあるアドレスを検索するプログラム(下記)なのですが、 (1)アドレスが一致しないときに、再び検索できるようにしたいのですが、うまくできません。 (2)address2.txtに登録してあるアドレスの7行目以降は検索されなくなってしまいます。 これらの問題解決のご指摘をお願いします。 #define FNAME "address2.txt" #define RECORDLEN 16 #include <stdio.h> #include <stdlib.h> #include <string.h> char *format = "%-15s\n"; int main() { FILE *fp; char search[16], address[16],ans[8]; int no = 0, find = 0; fp = fopen(FNAME, "r+"); if(fp==NULL){ perror("ファイルエラー\n"); return -1; } printf("アドレスの入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", address) == EOF) break; if (strstr(address, search) != NULL) { find++; printf("アドレス: %s\n", address); } } if(find>=1){ printf("アドレスが一致しました。" ); } else { printf("アドレスが一致しません。\n"); printf("再度検索し直しますか?(Y/N)\n"); gets(ans); if(ans[0]=='y'||ans[0]=='Y') continue; else break; } fclose(fp); return 0; }

  • continueとbreakの位置

    「address2.txt」に登録してあるアドレスを検索するプログラムなのですが、アドレスが検索されない時に再度検索できるように付け足したのですが、「continueとbreakの位置が誤っている」と表示されます。どう訂正すればうまくいくのでしょうか? #define FNAME "address2.txt" #define RECORDLEN 16 #include <stdio.h> #include <stdlib.h> #include <string.h> char *format = "%-15s\n"; int main() { FILE *fp; char search[16], address[16],ans[8]; int no = 0, find = 0; fp = fopen(FNAME, "r+"); if(fp==NULL){ perror("ファイルエラー\n"); return -1; } printf("アドレスの入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", address) == EOF) break; if (strstr(address, search) != NULL) { find++; printf("アドレス: %s\n", address); } } if(find>=1){ printf("アドレスが一致しました。" ); } else { printf("アドレスが一致しません。\n"); printf("再度検索し直しますか?(Y/N)\n"); gets(ans); if(ans[0]=='y'||ans[0]=='Y') continue; else break; } fclose(fp); return 0; }

  • ファイル処理について

    大学の課題なのですが、何度取り組んでもエラーになるため、間違いのご指摘、または正答を教えていただけないでしょうか。 問題は以下のものです。 【問題】 ファイルから整数を読み込み,その値によってfpの読み込み位置をかえ,何度目の読み込みで0を読み込んだかを表示するプログラムを作成せよ. ファイルの内容の例 2,4,0, fpの読み込み位置を変えるにはfseekという関数を利用する. fseekの使い方: 現在の読み取り位置xだけずらすには, fseek(ファイルポインタ, x, SEEK_CUR); と記述する. STEP 1 データを一区切りで読み取る("2,"や"-4,"などの整数とコンマの組) 2 読み取ったデータに応じてfpを移動させる("2,"なら2移動,"-4,"なら-4移動) 3 0を読むまで繰り返す +++++*+++++fseek-exercise.c+++++*+++++ #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // (* ここに解答を書き加える *) while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // (* ここに解答を書き加える *) printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // (* ここに解答を書き加える *) } printf("%d回目です.",count); fclose(fp); return(0); } // 以上になります。 自分で作ったプログラムは以下のようになりました。 #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // fp = fopen(filename,"r"); if(fp == NULL){ printf("cannot open\n"); exit(1); } while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // c = fgetc(fp); printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // if(c > '0' || c< '9'){ i = atoi(&c); count++; if(i == 0){ break; } fseek(fp,i,SEEK_CUR); } } printf("%d回目です.",count); fclose(fp); return(0); } // どこを訂正していいのかわかりません。 どうぞ、よろしくお願いいたします。

  • ファイル入出力について教えて下さい。2

    ご覧いただきありがとうございます。 何度も低レベルな質問で申し訳ありません。 A.PRMというファイルに、 I have a pen. He has a pen. と2行の文章が入っています。 これを読み取り、printfで画面表示させたいのですが、 #include <stdio.h> int main(void) { FILE *fp; char a[50]; char b[50]; if( (fp=fopen("A.PRM", "r" )) != EOF ) { fgets( a, 49, fp ); fgets( b, 49, fp ); } fclose( fp ); printf( "a = %s\n", a ); printf( "b = %s\n", b ); return 0; } とすると、fgetsで余分な改行が入ってしまいます。 fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。 どうしたらよいでしょうか? 是非ご回答いただきたいです。よろしくお願いいたします。

  • プログラムの実行

    このプログラム(下)なんですが、実行はできますが、実行結果が自分が思っているのとは異なる結果がでてしまいます。 'database.txt'には、1~100までの半角数字で入力した数字が1あがるごとに改行して保存しています。 僕は、例えばこのプログラムで2を入力すると、「一致しました」と表示されて、登録されていない数字345とかを入力すると「検索されませんでした」と表示されるようにしたいのですが、適当な数字を入れても「一致しました」と表示される場合があるのでこれを改善する方法を教えてください。 #define FNAME "database.txt" #define RECORDLEN 88 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char search[8],num[2]; int no = 0, find = 0, ip; fp = fopen(FNAME, "r"); if (fp == NULL) { perror("ファイルがオープンできません\n"); return -1; } printf("検索する番号の入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", num) == EOF) break; if (strstr(num, search) != NULL) { find++; fscanf(fp, "%d", &ip); printf("番号結果: %d\n", ip); break; } } if(find==0){ printf("検索されませんでした\n"); } else{ printf("一致しました。\n"); } fclose(fp); return 0; }

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • プログラム実行

    下記のプログラムを実行したら、 「警告 W8065 random01.c 15: プロトタイプ宣言のない関数 'strcat' の呼び出し(関数 ma in ) エラー E2342 random01.c 15: パラメータ '__path' は const signed char * 型として 定義されているので int は渡せない(関数 main ) 警告 W8065 random01.c 34: プロトタイプ宣言のない関数 'strcmp' の呼び出し(関数 ma in ) 警告 W8065 random01.c 34: プロトタイプ宣言のない関数 'strcmp' の呼び出し(関数 ma in )」 と表示されました。どこを改善すればうまくいきますか? OSはWinXPでコンパイラはボーランドのフリーコンパイラを使用しています。 #define RECORDLEN 33 #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char fname[256], data[16], ans[8]; int no; printf("ファイル名"); fp = fopen(strcat(gets(fname), ".txt"), "r"); if (fp == NULL) { perror("ファイルがオープンできません\n"); return -1; } while (1) { printf("何人目のデータを読み込みますか---"); gets(ans); no = atoi(ans); fseek(fp, RECORDLEN * (no - 1), SEEK_SET); if (fscanf(fp, "%s", data) == EOF) { perror("読み込みエラーです\n"); continue; } printf("[氏名] %s", data); fscanf(fp, "%s", data); printf("[電話] %s\n", data); printf("続けますか(y/n): "); gets(ans); if (strcmp(ans, "n") == 0 || strcmp(ans, "N") == 0) break; } fclose(fp); return 0; }

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • C言語 ファイル読み込み結果の表示

    読み込むファイル: aaa.csv A,B,C,1.2,1.2 D,E,F,1.4,1.2 実行結果: A B C 1.2 1.2 D E F 1.4 1.2 E F 1.4 1.2 下記のコードを実行した時、実行結果が上記のような三行となります。 3行目の"E F 1.4 1.2"がなぜ表示されてしまうのかわかりません。 御教示いただければ幸いです。 [code] #include <stdio.h> int main(void) { FILE *fp; char data1[20][100]; int line; fp = fopen("aaa.csv", "r" ); if( fp == NULL ){ return -1; } while(1){ if(line = fscanf(fp, "%[^,],%[^,],%[^,],%[^,],%s", data1[0],data1[1],data1[2],data1[3],data1[4])==EOF){ return -1; }else{ printf("%s %s %s %s %s", data1[0], data1[1], data1[2], data1[3], data1[4]); } } fclose( fp ); return 0; } [\code]

専門家に質問してみよう