C言語関係掲示板

過去ログ

No.190.ファイル内の特定文字列の存在確認


No.1206

ファイル内の特定文字列の存在確認
投稿者---ジョー(2002/03/07 11:46:08)


ファイル内に変数等で指定した文字列が存在するかどうかをチェックする処理はどのようにすればいいのでしょうか?

宜しくお願い致します。

No.1214

Re:ファイル内の特定文字列の存在確認
投稿者---かずま(2002/03/07 14:38:49)


#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char buf[1024];

    if (argc != 2)
        return printf("usage: %s string <file\n", argv[0]), 2;

    while (fgets(buf, sizeof buf, stdin))
        if (strstr(buf, argv[1]))
            return printf("found\n"), 0;

    printf("not found\n");
    return 1;
}



No.1221

Re:ファイル内の特定文字列の存在確認
投稿者---ジョー(2002/03/08 12:45:42)


実際にどれが対象ファイルで、どれが検索文字列になりますでしょうか?
初心者なもので宜しくお願い致します。

No.1222

Re:ファイル内の特定文字列の存在確認
投稿者---ジョー(2002/03/08 15:02:57)


>実際にどれが対象ファイルで、どれが検索文字列になりますでしょうか?
>初心者なもので宜しくお願い致します。
追加でお願いなのですが、【この処理は検索対象の文字列を取得】
などをコメントでプログラムに入れていただけないでしょうか?
まだ、Cをはじめたばかりで何をしているのか分からないもので
宜しくお願い致します。

No.1227

Re:ファイル内の特定文字列の存在確認
投稿者---C職人(2002/03/09 14:23:13)


>>実際にどれが対象ファイルで、どれが検索文字列になりますでしょうか?
>>初心者なもので宜しくお願い致します。
>追加でお願いなのですが、【この処理は検索対象の文字列を取得】
>などをコメントでプログラムに入れていただけないでしょうか?
>まだ、Cをはじめたばかりで何をしているのか分からないもので
>宜しくお願い致します。

こんな感じでどうでしょうか。
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
FILE *in_fp;
char line[256];
char *p,*head;
int lineNo=0;

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:検索ファイル 検索語\n");
return 1;
}

/*ファイルオープン*/
in_fp=fopen(argv[1],"r");
if(in_fp==NULL){
fprintf(stderr,"ファイル[%s]を開くことができません。\n",argv[1]);
return 1;
}

/*読み込んだ一行の先頭アドレスを指すようにしておく*/
p=line;

/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
head=line;

/*ファイルエンドまで*/
while(fgets(line,256,in_fp) != NULL){
/*行数カウンタ*/
lineNo++;
/*読み込んだ一行から検索後を探し、その位置を取得*/
p=strstr(line,argv[2]);
/*見つからなければ次の行を読みに行く*/
if(p==NULL){
continue;
}
/*見つかったら、行数と何文字目かを表示する*/
else{
fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
}
}

return 0;
}






No.1232

Re:ファイル内の特定文字列の存在確認
投稿者---かずま(2002/03/11 00:03:01)


>実際にどれが対象ファイルで、どれが検索文字列になりますでしょうか?

プログラムに対する要求仕様が不明確です。
まず、それをはっきりさせて下さい。たとえば、

対象ファイルの名前はどのようにして与えますか。
1. プログラム内に書く。
2. 実行時に、キーボートから入力。
3. コマンド行の引数。
4. 標準入力のリダイレクト。

検索文字列はどのようにして与えますか。
1. プログラム内に書く。
2. 実行時に、キーボートから入力。
3. コマンド行の引数。

検索文字列の存在確認は、
1. あるか、ないかだけを表示。
2. いくつあるかを表示。
3. どこにあるかを表示。
 3.1 先頭から何バイト目。
 3.2 何行目の何バイト目。

> 初心者なもので宜しくお願い致します。

初心者だけではあなたのレベルがわかりません。
ファイルの読み書きは出来ますか。
使っている参考書は何ですか。



No.1228

Re:ファイル内の特定文字列の存在確認
投稿者---サイトウ(2002/03/09 18:08:32)


はじめまして。わからないところがあるので、教えてください。

if (argc != 2)
return printf("usage: %s string <file\n", argv[0]), 2;

こういった書き方は初めて見たのですが、

if (argc != 2) {
 printf("usage: %s string <file\n", argv[0]);
 return 2;
}
と同じことですか。

while (fgets(buf, sizeof buf, stdin))

ここは、stdinから入力していますが、検索文字列を入力しない
場合は、どうしたらループから抜けて、
printf("not found\n");
return 1;
まで行きますか。

よろしくお願いします。

No.1258

Re:ファイル内の特定文字列の存在確認
投稿者---ジョー(2002/03/15 12:48:24)


下記のC職人さんに教えていただいたプログラムのなかで、文字列を検索して存在しなかった場合にメッセージを出力するにはどのように追加すればよろしいのでしょうか?
お分かりになる方はぜひ教えて下さい。
お願い致します。

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
FILE *in_fp;
char line[256];
char *p,*head;
int lineNo=0;

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:検索ファイル 検索語\n");
return 1;
}

/*ファイルオープン*/
in_fp=fopen(argv[1],"r");
if(in_fp==NULL){
fprintf(stderr,"ファイル[%s]を開くことができません。\n",argv[1]);
return 1;
}

/*読み込んだ一行の先頭アドレスを指すようにしておく*/
p=line;

/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
head=line;

/*ファイルエンドまで*/
while(fgets(line,256,in_fp) != NULL){
/*行数カウンタ*/
lineNo++;
/*読み込んだ一行から検索後を探し、その位置を取得*/
p=strstr(line,argv[2]);
/*見つからなければ次の行を読みに行く*/
if(p==NULL){
continue;
}
/*見つかったら、行数と何文字目かを表示する*/
else{
fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
}
}

return 0;
}


No.1259

Re:ファイル内の特定文字列の存在確認
投稿者---C職人(2002/03/15 15:11:47)


>下記のC職人さんに教えていただいたプログラムのなかで、文字列を検索して存在しなかった場合にメッセージを出力するにはどのように追加すればよろしいのでしょうか?
>お分かりになる方はぜひ教えて下さい。
>お願い致します。
>
>#include <stdio.h>
>#include <string.h>
>
>int main(int argc,char *argv[])
>{
>FILE *in_fp;
>char line[256];
>char *p,*head;
>int lineNo=0;
>
>/*引数の数チェック*/
>if(argc != 3){
>fprintf(stderr,"使用法:検索ファイル 検索語\n");
>return 1;
>}
>
>/*ファイルオープン*/
>in_fp=fopen(argv[1],"r");
>if(in_fp==NULL){
>fprintf(stderr,"ファイル[%s]を開くことができません。\n",argv[1]);
>return 1;
>}
>
>/*読み込んだ一行の先頭アドレスを指すようにしておく*/
>p=line;
>
>/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
>head=line;
>
>/*ファイルエンドまで*/
>while(fgets(line,256,in_fp) != NULL){
>/*行数カウンタ*/
>lineNo++;
>/*読み込んだ一行から検索後を探し、その位置を取得*/
>p=strstr(line,argv[2]);
>/*見つからなければ次の行を読みに行く*/
>if(p==NULL){
>continue;
>}
>/*見つかったら、行数と何文字目かを表示する*/
>else{
>fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
>}
>}
>
>return 0;
>}

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
FILE *in_fp;
char line[256];
char *p,*head;
int lineNo=0;
int foundCnt=0;

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:検索ファイル 検索語\n");
return 1;
}

/*ファイルオープン*/
in_fp=fopen(argv[1],"r");
if(in_fp==NULL){
fprintf(stderr,"ファイル[%s]を開くことができません。\n",argv[1]);
return 1;
}

/*読み込んだ一行の先頭アドレスを指すようにしておく*/
p=line;

/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
head=line;

/*ファイルエンドまで*/
while(fgets(line,256,in_fp) != NULL){
/*行数カウンタ*/
lineNo++;
/*読み込んだ一行から検索後を探し、その位置を取得*/
p=strstr(line,argv[2]);
/*見つからなければ次の行を読みに行く*/
if(p==NULL){
continue;
}
/*見つかったら、行数と何文字目かを表示する*/
else{
fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
/*見つけたときは、カウントしてやる*/
foundCnt++;
}
}

/*検索文字がファイルに1つも存在しなかったとき*/
if(foundCnt==0){
fprintf(stderr,"検索文字[%s]はファイル[%s]に存在しませんでした。\n",argv[2],argv[1]);
return 1;
}

return 0;
}
上記のようにカウント変数をもうけて、カウントが0のままなら検索文字列が
一つもないということなのでそれで判断すればできますね。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved