• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[C言語]トラバースするプログラム(linux))

[C言語]トラバースするプログラム(linux)

このQ&Aのポイント
  • linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。
  • 例えばディレクトリaにファイルbとディレクトリcがあり、ディレクトリcの中にはファイルdとディレクトリeがあり、ディレクトリeの中にはファイルfがあるとします。
  • 僕の理想では$./traverse aとすると.. .b c .. .d e .. .fとなるはずなんですが(表示の順番は適当です)、実際はb .. .cとなってしまいうまくトラバースしてくれませんどうしてこうなるかわかりません誰か助けてくださいお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

失礼ですが、プログラムが間違ってますよ。 引数pathにディレクトリ名を渡してます。 このままだと"c"をlstatしてしまいます。 カレントにディレクトリ"c"は存在していませんので、ここでエラーです。 正しくはlstat("a/c", &st);ですよね。 そんな風になおして以下のようなテストコードを書いてみたところ 動きましたので貼っておきます。 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<string.h> static void do_traverse(char *patht, int t); int main(int argc, char *argv[]) {   int i;   if (argc < 2) {     fprintf(stderr, "%s: no arguments\n", argv[0]);     exit(1);   }   for (i = 1; i < argc; i++) {     do_traverse(argv[i], 0);   }   return 0; } static void do_traverse(char *path, int t) {   DIR *d;   struct dirent *ent;   int i;   d = opendir(path);   if (!d) {     perror(path);     exit(1);   }   while ((ent = readdir(d)) != NULL) {     struct stat st;     char newpath[BUFSIZ];     sprintf(newpath, "%s/%s", path, ent->d_name);     if (lstat(newpath, &st) < 0) {       perror(newpath);       exit(1);     }     for (i = 0; i < t; i++) {       printf(" ");     }     printf("%s\n", ent->d_name);     if ((strcmp(".", ent->d_name)) == 0       || (strcmp("..", ent->d_name)) == 0 || S_ISLNK(st.st_mode)) {       continue;     }     if (S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) {       do_traverse(newpath, t + 1);     }   }   closedir(d); }

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

質問文中の「例えば~」の状況で ./traverse c と実行した場合, どうなると思いますか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

do_traverse の引数がどうなっているか確認しましたか?

puntero
質問者

補足

どう考えてもこのプログラムに間違いがあると思えません 確認してもどこに間違いがあるのか検討もつきません

関連するQ&A