• ベストアンサー

特定の文字列が一致する行から、文字列を抽出する方法

ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか? 処理: test.txt中に以下の文字列が記載されています。 ----- TEST011:FILE00 TEST01:FILE01 TEST02:FILE02 XTEST01:FILE01 XTEST02:FILE02 ----- test.txtから、TEST01に対応する文字列FILE01を取得したいです。 当初、strchrを利用すれば良いかと考えていたのですが、 TEST011の行が先に抽出されてしまい、うまくいきません。 どなたか解決方法を教えていただけないでしょうか。

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

  • ベストアンサー
  • towad
  • ベストアンサー率80% (4/5)
回答No.3

strtok()で':'をトークンとして文字列を切り出し、検索文字列と比較すると良いのではないでしょうか。 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char line[256]; char* ptr; if (argc < 2) return 0; fp = fopen("test.txt","rt"); while (fgets(line, 255, fp)) { ptr = strtok(line, ":"); if (strcmp(ptr, argv[1]) == 0) { ptr = strtok(NULL, "\n"); printf("%s\n", ptr); } } fclose(fp); return 0; } > ./a.out TEST01 FILE01 >

rui58
質問者

お礼

ご回答ありがとうございます。 この関数はしりませんでした。 とても参考になりました。

その他の回答 (3)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.4

>"TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか? strchr() や strstr() は戻り値として、どこでマッチしたかを返すので問題ないと思いますけど

rui58
質問者

お礼

なるほど、マッチした位置を確認すればいいのですね。 気づきませんでした。 ご助言いただき、ありがとうございます。

回答No.2

>test.txtから、TEST01に対応する文字列FILE01を取得したいです。 >当初、strchrを利用すれば良いかと考えていたのですが、 >TEST011の行が先に抽出されてしまい、うまくいきません。 検索キーが「TEST01」で TEST011:FILE00 ←一致しない TEST01:FILE01 ←一致する TEST02:FILE02 ←一致しない XTEST01:FILE01 ←一致しない XTEST02:FILE02 ←一致しない としたければ 「先頭から"TEST01"で始まっていて、直後に":"がある行」を検索すれば良いでしょう。 言い換えれば「先頭から"TEST01:"で始まっている行」です。 処理としては 1.検索文字の後ろに":"を付加する("TEST01"を"TEST01:"にする) 2.test.txtから読み込んだ1行の先頭から、検索文字に一致するか調べる 3.EOFになるまで2を繰り返す となります。 #include <stdio.h> #include <string.h> int main(void) { char input_string[256]; char check_string[256]; char read_string[256]; char find_string[256]; FILE *fp; int length; fp = fopen("test.txt","rt"); gets(input_string); strcpy(check_string,input_string); strcat(check_string,":"); length = strlen(check_string); for(;;){ if (foef(fp)) break; fgets(read_string,256,fp); if (!strncmp(read_string,check_string,length)) { strcpy(find_string,read_string[length]); printf("%s\n",find_string); break; } } fclose(fp); return 0; } 上記プログラムは「肝心な部分はこういう風に書けば良い」と言う例示なので、動作試験していません。また、エラーチェックもしていません。バッファオーバーフローも考慮していません。 実用にするなら「エラーをチェックする」「文字列の最大長を考慮する」「getsやstrcpyなど危険な関数は使わない」必要があるので、変更しましょう。

rui58
質問者

お礼

サンプルプログラムまで作成していただき、ありがとうございます。 実装がイメージでき、とても参考になりました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

"TEST01:" で検索ではいかんの?

rui58
質問者

補足

質問が適切ではありませんでしたが、txt内の順序が違う場合にも対応したいです。 "TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか?

関連するQ&A