プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

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

A 回答 (4件)

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
>
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/24 23:27

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



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

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

お礼日時:2009/12/24 23:28

>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など危険な関数は使わない」必要があるので、変更しましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/24 23:29

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

この回答への補足

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

補足日時:2009/12/22 00:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A