みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか?

処理:
test.txt中に以下の文字列が記載されています。
-----
TEST011:FILE00
TEST01:FILE01
TEST02:FILE02
XTEST01:FILE01
XTEST02:FILE02
-----

test.txtから、TEST01に対応する文字列FILE01を取得したいです。
当初、strchrを利用すれば良いかと考えていたのですが、
TEST011の行が先に抽出されてしまい、うまくいきません。

どなたか解決方法を教えていただけないでしょうか。

投稿日時 - 2009-12-21 22:53:51

QNo.5538934

暇なときに回答ください

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

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
>

投稿日時 - 2009-12-22 20:53:03

お礼

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

投稿日時 - 2009-12-24 23:27:57

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>"TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか?

strchr() や strstr() は戻り値として、どこでマッチしたかを返すので問題ないと思いますけど

投稿日時 - 2009-12-23 08:14:50

お礼

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

投稿日時 - 2009-12-24 23:28:30

ANo.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など危険な関数は使わない」必要があるので、変更しましょう。

投稿日時 - 2009-12-22 01:43:50

お礼

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

投稿日時 - 2009-12-24 23:29:26

ANo.1

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

投稿日時 - 2009-12-21 23:34:37

補足

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

投稿日時 - 2009-12-22 00:29:21

あなたにオススメの質問