2016-08-21 4 views
-4

私はディレクトリとユーザーのフォルダ名を収集するプログラムを作っていますが、私は趣味としてこれをやっています。ディレクトリリスタープログラムに問題があり、C++

言語:C++

IDE:コードブロック

問題:以下のディレクトリ内のファイルのリストを持つテキストファイルを作成したとしているが、私はそれを実行すると、それはそれを行いません。 、それは何もしません。

コード:

void w_file(string filename_s, char * content) 
{ 
    // Change string to const char * 
    const char * filename_cc = filename_s.c_str(); 

    // Writing File Code 
    ofstream file; 
    file.open(filename_cc,ios::app); 
    file << content << endl; 
    file.close(); 
    return; 
} 

コンパイラ出力:ステータス0(0分(S)で終端

工程、1秒

void directory_lister() // List folders in respective directories. 
{ 
    string dir_hos = " "; 
    int cycle = 0; 
    string dir_program = "C:\\Program Files\\"; 
    string dir_program32 = "C:\\Program Files (x86)\\"; 
    string dir_users = "C:\\Users\\"; 

    while (cycle < 3){ 

     if(dir_hos != dir_program){ 
      dir_hos = dir_program; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #1. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     }else if(dir_hos != dir_program32){ 
      dir_hos = dir_program32; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #2. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     }else if(dir_hos == dir_users){ 
      dir_hos = dir_users; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #3. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     } 

    } 

    return; 
} 

int main(){ 
    directory_lister(); 
    return 0; 
} 

またw_file関数がこれです 0エラー、0警告(0分、1秒)

0 (drnt =のreaddir(DIR))しながら、例えば、私は余分な括弧を持っていない。この前

、が、コンパイラは私にはない約3警告を与える:


不良コード#1、#2、#3十分な括弧(正常にコンパイルされても動作しません)、私はそれらを追加しますが、それでも動作しません。

「=」の代わりに「=」を使ってみましたが、プログラムがハングしてクラッシュしました。クラッシュする前に、 "directories.txt"を作成しました。


その他:

私は私がきちんと書かれていませんが、私はプログラミングが下手だので、私はそれを把握することはできません他のコードがあると思います。あなたは私がそれを修正するのを手伝ってもらえますか?私はこれから何かを学ぶと確信しています。ありがとうございました!別のノートで


私はdirent.hを使用してでは特によくないです、私はそれを使用するたびに私は(私は通常の例を検索して使用するのが最も簡単なものをコピーし、ぼかしていますI恥ずかしいですが、私はドキュメントを読むと非常に混乱しています)。

+0

このような問題を解決する適切なツールは、デバッガを使用することですが、そうする前にスタックオーバーフローを尋ねることはありません。 1つ目の行でコードを検査するときに行ったすべての観察を教えてください。また、** [小さなプログラムをデバッグする方法(Eric Lippertによる)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)**を読んでみてください。**少なくともあなたの問題を再現する[MCVE]を残してください。 (これはπάνταῥεῖ™によって提供される個人的な株式コメントです) –

+0

@Spera(1)は「動作しません」と定義し、望ましい行動と観察された行動の詳細な説明を提供する、(2)コンパイルできるコード例を提供する(ヒント:プログラムをビルドするために 'main()'関数が必要です)、(3)あなたのポストにそれをコピーすることによって、すべての関連コンソールの出力を提供してください(そのまま、 ) – Drop

+0

@Drop、Done、done、done。 – Spera

答えて

0

readdir()に提供された引数は、以前はopendir()によって返された値であると仮定されています。つまり、nullポインタを指定するとエラーが発生します。

opendir()によって返された値は、決して変数に格納されません。つまり、すぐに破棄され、確実にreaddir()に渡されません。

通常、関数の戻り値を確認することをお勧めします。たとえば、opendir()はエラー時にNULLポインタを返します。

私は、他の問題があるかどうかを判断するために十分に注意を払っていません....しかし、私が特定した問題を解決することは、とにかくあなたのための教育になります。

+0

ああ、私はdpendにopendir()を格納する必要があります、dir = opendir();ありがとうございます。 – Spera

+0

できるだけ早く修正をお試しいただきますよう大変ありがとうございます。 – Spera

関連する問題