カレントディレクトリ内にある.cファイルの検索

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天和

カレントディレクトリ内にある.cファイルの検索

#1

投稿記事 by 天和 » 15年前

カレントディレクトリ内にある.cファイルのすべてを大将にしてその次に検索したい言葉を入力して
ファイル名と検索したい言葉がある行の文章そしてその行の行数を出力するプログラムを作りたいのですが。
できれば前回のプログラムソース(http://www.play21.jp/board/formz.cgi?ac ... &rln=45446
をもとに作るようなソースコードがいいです。
#include<stdio.h>
int main(void)
{
char ch;
FILE *fp;
char fname[99]; /*検索したいファイル名*/
char word[99]; /*検索したい文字列*/
char string[1024];
int i, j, n, s, count;
int count2 = 0;/*行の文字数*/
int count3 = 0;/*forループ用*/
int flag = 0;

i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が何文字あっているか?*/
s = 0;/*検索したい文字列の文字数*/
count = 0;
printf("FILEname?\n");
scanf("%s", fname);
printf("検索したい文字は?");
scanf("%s", word);
while(1){    /*検索したい文字列は何文字か判定する*/
if(word[j] == '\0')/*ヌル文字があったら測定終了*/
break;
s++;
j++;
}
j = 0;/*また1文字目からやり直すためにいったんリセット*/

if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
printf("ERROR");
else{
/*最初の行数*/
i++;

while((ch = fgetc(fp)) != EOF){
string[count2] = ch;
count2++;

if(count == 0){/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
j = 0;
n = 0;
}
if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
{
n++;/*同じ文字かの正解数を1つあげる*/
count++;/*現在の文字が正解か否かの判定*/
j++;/*検索したい次の文字にチャレンジする*/
}
else{
count = 0;/*不合格なので検索したい最初の文字からやり直し*/
}

if(s == n){/*もし検索したい文字数と正解数が一緒ならその行を出力しなさい*/
printf("%d:", i);
flag = 1;
j = 0;
n = 0;
}
if(ch == '\n'){/*もし改行なら行番号をあげなさい*/
i++;
string[count2] = '\0';
if(flag == 1){
count3 = 0;/*forループにしよう*/

for(; count3 < count2 + 1; ++count3)
{
printf("%c", string[count3]);
}
}
count2 = 0;
flag = 0;
}
}
fclose(fp);
}
return 0;
}
まずはファイルを一つではなく全対象にする方法をお願いします
コンパイラはGCC
技術レベルはfopenが使える程度です。

MNS

Re:カレントディレクトリ内にある.cファイルの検索

#2

投稿記事 by MNS » 15年前

このままだと、いわゆる"丸投げ"になってしまうので、
ある程度のところまでは自身でやる必要があります。
FindFirstFile()、 FindNextFile()、FindClose()あたりを調べてみてください。

必要なことは、適当な変数をグローバル変数にすることと、

if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/

これ以降を関数化することです。

dic

Re:カレントディレクトリ内にある.cファイルの検索

#3

投稿記事 by dic » 15年前

見やすいように
ペタリ
#include<stdio.h>
int main(void)
{
    char ch;
    FILE *fp;
    char fname[99]; /*検索したいファイル名*/
    char word[99]; /*検索したい文字列*/
    char string[1024];
    int i, j, n, s, count;
    int count2 = 0;/*行の文字数*/
    int count3 = 0;/*forループ用*/
    int flag = 0;

    i = 0;/*行数用の数字*/
    j = 0;/*j番目の文字列*/
    n = 0;/*検索したい文字列が何文字あっているか?*/
    s = 0;/*検索したい文字列の文字数*/
    count = 0;
    printf("FILEname?\n");
    scanf("%s", fname);
    printf("検索したい文字は?");
    scanf("%s", word);
    while(1){    /*検索したい文字列は何文字か判定する*/
        if(word[j] == '\0')/*ヌル文字があったら測定終了*/
            break;
        s++;
        j++;
    }
    j = 0;/*また1文字目からやり直すためにいったんリセット*/

    if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
        printf("ERROR");
    else{
        /*最初の行数*/
        i++;

        while((ch = fgetc(fp)) != EOF){
            string[count2] = ch;
            count2++;

            if(count == 0){/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
                j = 0;
                n = 0;
            }
            if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
            {
                n++;/*同じ文字かの正解数を1つあげる*/
                count++;/*現在の文字が正解か否かの判定*/
                j++;/*検索したい次の文字にチャレンジする*/
            }
            else{
                count = 0;/*不合格なので検索したい最初の文字からやり直し*/
            }

            if(s == n){/*もし検索したい文字数と正解数が一緒ならその行を出力しなさい*/
                printf("%d:", i);
                flag = 1;
                j = 0;
                n = 0;
            }
            if(ch == '\n'){/*もし改行なら行番号をあげなさい*/
                i++;
                string[count2] = '\0';
                if(flag == 1){
                    count3 = 0;/*forループにしよう*/
                    for(; count3 < count2 + 1; ++count3)
                    {
                        printf("%c", string[count3]);
                    }
                }
                count2 = 0;
                flag = 0;
            }
        }
        fclose(fp);
    }
    return 0;
}

>まずはファイルを一つではなく全対象にする方法をお願いします
#define    DEF_NUM    10
    char    filename[DEF_NUM][99];
    int    i;
    for( i=0; i<DEF_NUM; i++ )
    {
        printf( "検索したファイル名は?:" );
        scanf( "%s", filename );
    }

でいいかと思います

qwerty

Re:カレントディレクトリ内にある.cファイルの検索

#4

投稿記事 by qwerty » 15年前

思うのですが、質問者はもう少し(本来ならば回答者以上に)自分の書いた文章を推敲するべきです。
なにも完璧に仕上げる必要はありませんし、不可能でしょうが、ある程度はやるべきです。
見ていると、一度見直せばすぐ気付くような誤字が多かったり、表現の統一性がありません。
これは技術レベル云々よりも、センスの問題です。

天和

Re:カレントディレクトリ内にある.cファイルの検索

#5

投稿記事 by 天和 » 15年前

>qwertyさん
すいません以後気をつけます

qwerty

Re:カレントディレクトリ内にある.cファイルの検索

#6

投稿記事 by qwerty » 15年前

カレントディレクトリにあるファイル一覧を取得する方法ですが、
FindFirstFile()などのAPIを用いても良いと思いますが、
windows.hというヘッダを別にインクルードしなければなりません。

system関数を利用して環境にあった方法で、
カレントディレクトリにあるファイル一覧をテキストファイル形式で出力させ、
それを読み込むこともできます。
多くの場合は[ファイル一覧表示コマンド] > [出力ファイル名]でファイルをはいてくれます。

天和

Re:カレントディレクトリ内にある.cファイルの検索

#7

投稿記事 by 天和 » 15年前

>qwertyさん
おおーありがとうございます
system(ls > ファイル名);
とやったらそこにファイル内にファイル名の一覧が載ってました
おかげで何とかなりそうですありがとうございましたー。

天和

Re:カレントディレクトリ内にある.cファイルの検索

#8

投稿記事 by 天和 » 15年前

連レスすいません
解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る