
ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか?
処理:
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- その他(メールソフト・メールサービス) このメールは何ですか 8 2023/06/15 17:31
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語で特定の行を抽出する方法を教えてください。
C言語・C++・C#
-
テキストファイル内に対して, 特定の単語を探すプログラム c言語
C言語・C++・C#
-
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
-
4
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
5
C言語で特定列だけを抽出して配列に格納し、出力したいです。 読み込みファイル(read.txt) 0
C言語・C++・C#
-
6
atoi( ) の反対をやりたい
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
C言語 空白の行(改行のみ)が入力されたらプログラムを終了する処理
C言語・C++・C#
-
9
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
10
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
【Java8以降】csvファイルの複...
-
strcmp関数などでの複数の文字...
-
C#でIPアドレスの取得について
-
java HashMapで数値データを取...
-
boostスマートポインタ(shared_...
-
jap実行時のTomcatのエラーに困...
-
Javaで文字と数字が混ざったも...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
数値⇒漢数字変換 java
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
「配列定数は、イニシャライザ...
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
-
x^2+y^2<n^2
-
JSPでImportエラーになります
-
#の表記
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
【Java8以降】csvファイルの複...
-
特定の文字列が一致する行から...
-
C#でIPアドレスの取得について
-
マルチスレッドで同時にFTPアッ...
-
Delphiで改行文字の置換がうま...
-
jap実行時のTomcatのエラーに困...
-
strcmp関数などでの複数の文字...
-
C# JSONについて
-
C#での関数テーブルの作り方
-
string→CStringの型変換について
-
「指定されたキャストは有効で...
-
C#のdelegateについて
-
C#のStreamReaderでのforeach
-
strtokでの空文字への置き換え
-
C++/CLI 関数がインポートでき...
-
GridViewで複数のDropDownList...
-
クラスの変換について
-
java HashMapで数値データを取...
-
決まった拡張子のファイルだけ...
おすすめ情報