
ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか?
処理:
test.txt中に以下の文字列が記載されています。
-----
TEST011:FILE00
TEST01:FILE01
TEST02:FILE02
XTEST01:FILE01
XTEST02:FILE02
-----
test.txtから、TEST01に対応する文字列FILE01を取得したいです。
当初、strchrを利用すれば良いかと考えていたのですが、
TEST011の行が先に抽出されてしまい、うまくいきません。
どなたか解決方法を教えていただけないでしょうか。
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
>
No.4
- 回答日時:
>"TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか?
strchr() や strstr() は戻り値として、どこでマッチしたかを返すので問題ないと思いますけど
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など危険な関数は使わない」必要があるので、変更しましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語で特定の行を抽出する方法を教えてください。
C言語・C++・C#
-
テキストファイル内に対して, 特定の単語を探すプログラム c言語
C言語・C++・C#
-
C言語で特定列だけを抽出して配列に格納し、出力したいです。 読み込みファイル(read.txt) 0
C言語・C++・C#
-
-
4
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
5
atoi( ) の反対をやりたい
C言語・C++・C#
-
6
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
7
複数ファイルの同時読み込みの方法と脱初心者向け参考書
C言語・C++・C#
-
8
c#でcsvから指定の1行だけを読み込む方法
C言語・C++・C#
-
9
C言語でファイルから特定の文字を抽出
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ArrayListを改良したい
-
特定の文字列が一致する行から...
-
C#のStreamReaderでのforeach
-
「指定されたキャストは有効で...
-
java HashMapで数値データを取...
-
C#での関数テーブルの作り方
-
GDI+ DrawString() で指定範囲...
-
【Java8以降】csvファイルの複...
-
ループ処理の際、最後だけ","を...
-
(Swing)JTextFieldを半角のみ入...
-
オブジェクトの中のプロパティ...
-
System.err. printlnとSystem.o...
-
VB.net 引数で配列変数を渡す際...
-
IF関数でEmpty値を設定する方法。
-
JSPやサーブレットでSystem.out...
-
ORA-01858: 数値を指定する箇所...
-
<forEach> 内で供給された "ite...
-
0dの意味を教えてください
-
動的配列が存在(要素が有る)か...
-
C#で動的配列Listの中身をListB...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
C# ListBoxのアイテムをユーザ...
-
マルチスレッドで同時にFTPアッ...
-
strcmp関数などでの複数の文字...
-
特定の文字列が一致する行から...
-
デバックができない C#
-
「(string)$i」のような変則な文
-
C#でIPアドレスの取得について
-
★C#のXML読み込みについて
-
p->next(ポインタ)的なことを...
-
jap実行時のTomcatのエラーに困...
-
string→CStringの型変換について
-
C#についてです
-
プログラミングC++に関して質...
-
ArrayListを改良したい
-
コンストラクタの変数を別のコ...
-
「指定されたキャストは有効で...
-
C# List型のIndesOf メゾットに...
-
strtokでの空文字への置き換え
-
C#での関数テーブルの作り方
おすすめ情報