【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23021

再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---ペケ(2005/09/10 19:23:15)


はじめて投稿します。
よろしくお願いします。

のっけから図々しいお願いですが、アドバイスをお願いします。

学校で、「再帰をつかって、ファイル名の一覧をサブフォルダまで表示するプログラムを作成せよ」と言う課題を出されたんですが、うまく行きません。
pathを読みこんで表示するまではうまく行ったんですが、サブフォルダの中身を表示できません。

フォルダを判定する部分が機能していないらしいのですが、あちこち調べてみてもどこが悪いのかが分かりません。
環境は、時代遅れのwin98(SE)です。コンパイラはBCC5.5を使ってます。
ソースは以下です。
どなたか助言をお願い致します。

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

#define S_MAX 256   //pathの最大文字数

    
int f_show(char *p);

int main(void)
{   
    char path[S_MAX], sel;  //pathの入力用

    int i;

    //pathの入力とヌル文字の追加

    printf("調べたいフォルダのパスを入力して下さい\n");
    fgets(path, S_MAX, stdin);
    i = strlen(path) - 1;   
    if(path[i] == '\n') path[i] = '\0';
    
    f_show(path);

    return 0;
}

int f_show(char *p)
{
    struct stat fi;
    struct dirent *dp;
    DIR *dir;
    char pa[S_MAX]; //pathのコピー先

        
    strcpy(pa, p);  //pathをコピー

    
    //フォルダを開く   

    if((dir = opendir(pa)) == NULL){
        perror("opendir");
        exit(1);
    }
        
    while((dp = readdir(dir)) != NULL){
        printf("%s\n", dp -> d_name);   //ファイル名を表示

        
        // この先の判定では"."と".."も含まれてしまうので、この2つであれば先頭に戻す 

        if(!(strcmp(dp->d_name, "."))|| !(strcmp(dp->d_name, "..")) ) 
            continue;
                
                stat(dp->d_name, &fi);
        
            /*フォルダであれば再帰になる・・・
              筈なのだが、ここの条件判定部が機能していないっぽい */
            if(S_ISDIR(fi.st_mode)){
                //paの末端に\\を付加してからフォルダ名を追加して新規pathを合成

            strcat(strcat(pa, "\\"), dp->d_name);
            f_show(pa);
        }
    }
    closedir(dir);
    
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい 23022 επιστημη 2005/09/10 21:53:06
<子記事> Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい 23025 si 2005/09/11 02:31:09
<子記事> Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい 23026 まきじ 2005/09/11 02:48:38


No.23022

Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---επιστημη(2005/09/10 21:53:06)


>フォルダを判定する部分が機能していないらしいのですが、

…であることをどうやって検証しましたか?
'らしい'ではなく、確証を得てください。それがデバッグの第一歩です。

if ( これはフォルダ ) {
/* ここにたとえばprintfを追加しても表示されませんか? */
}



この投稿にコメントする

削除パスワード

No.23023

Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---ペケ(2005/09/11 00:38:59)


すいませんでした。

早速ご指摘の通りにやって見ましたが、条件文以下は表示されませんでした。
念の為、ファイル名の再表示やフォルダ判定の結果表示など数通り試してみましたが、やはり何も表示されませんでした。

改めてアドバイスをお願いします。


この投稿にコメントする

削除パスワード

No.23024

Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---とおり(2005/09/11 01:45:31)


>改めてアドバイスをお願いします。

あちこちに同じようなprintfを入れて、各地点でのデータの値を調べて、
自分が期待している値かを見る。
期待した値に最初にならなかったところが、最初の問題ポイントなのだから。

期待した動きになっていない場所を突き止めるのが、デバッグの基本。


この投稿にコメントする

削除パスワード

No.23025

Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---si(2005/09/11 02:31:09)


> stat(dp->d_name, &fi); <- ? よく考えましょう
> /*フォルダであれば再帰になる・・・
> 筈なのだが、ここの条件判定部が機能していないっぽい */
> if(S_ISDIR(fi.st_mode)){

あなたは、いまどこに居ますか?


この投稿にコメントする

削除パスワード

No.23026

Re:再帰を使ったフォルダ内のファイルの表示法を教えて下さい
投稿者---まきじ(2005/09/11 02:48:38)


>stat(dp->d_name, &fi);

d_name に "hoge" と格納されていた場合、カレントディレクトリの
hoge というディレクトリの情報を、構造体 fi に格納しますが、
カレントディレクトリはどこか判りますか?


この投稿にコメントする

削除パスワード

No.23028

ありがとうございました
投稿者---ペケ(2005/09/11 16:09:46)


何がまずかったのかがようやく分かりました。
おかげで解決できました。

皆様ありがとうございました!


この投稿にコメントする

削除パスワード

No.23029

Re:ありがとうございました
投稿者---επιστημη(2005/09/11 17:23:09)


>何がまずかったのかがようやく分かりました。

何がまずかったのですか?
それを一言述べておくのが回答者に対する礼儀ってもんです。



この投稿にコメントする

削除パスワード

No.23030

度々すいません
投稿者---ペケ(2005/09/11 18:27:45)


身勝手な投稿を繰り返して申し訳ありません。

まずかったのは、以下の2点でした。
1つ目は、まきじさんとsiさんに指摘された点で、カレントディレクトリの位置を把握していなかった(それに、stat関数の理解がいい加減だった)ことです。
2つ目は、カレントディレクトリやpathに関する理解不足です。

それ以外にも、
・デバッグさえもろくに行っていなかったこと。
・只の教えて君になっていたこと。
は反省しております。


礼儀知らずのダメ学生のスレに付き合って頂き、ありがとうございました。
不快感を覚えた方がいらっしゃいましたら、ここでお詫びさせて頂きます。
すいませんでした。


この投稿にコメントする

削除パスワード

No.23031

Re:度々すいません
投稿者---まきじ(2005/09/11 19:41:13)


>カレントディレクトリの位置を把握していなかったことです。

それは、質問で判りますし、カレントディレクトリが違ってる事は
レスで推測可能でしょう。
肝心なのは、「カレントディレクトリはどこか?」という事です。
カレントディレクトリはどこでしたか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧