2016-04-05 14 views
0

私はdirent.hをC++で使用して、使用可能なディレクトリとファイルをマイディレクトリに取得しています。 and ".." それらを削除するには、印刷前にifステートメントを追加しました。次のように コードは次のとおりです。d_nameとコアダンプを生成するcstringとの比較

if ((dir = opendir (".")) != NULL) { 

    while ((ent = readdir (dir)) != NULL) 
    { 

     if(!strcmp(ent->d_name, ".")){ 
      printf ("%s\n", ent->d_name); 
     } 

     closedir (dir); 
    } 
} 
else { 
    //could not open directory 
    printf("Error opening directory"); 
} 

それは私にコンパイルエラーを与えるのではなく、実行するときに、それは私を与えている 「ダブル無料または破損(上):0x00000000016d3010を*** 中止(コアダンプ)」 どうすれば修正できますか?

答えて

0

!strcmp比較はバグですが、クラッシュとは関係ありません。それは です。ディレクトリを閉じて、ディレクトリからのエントリの読み取りを続けようとしています。

次のプログラムでは、エラーがコメント化されて修正されます。

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

int main(int argc, char **argv) 
{ 
    DIR * dir = NULL; 
    if ((dir = opendir (".")) != NULL) { 

     struct dirent * ent = NULL; 
     while ((ent = readdir (dir)) != NULL) 
     { 

      // if(!strcmp(ent->d_name, ".")){ <-- Bug you have yet to find. 
      if(strcmp(ent->d_name, ".")){ 
       printf ("%s\n", ent->d_name); 
      } 

      // closedir (dir); <-- The cause of your crash 

     } 
     closedir (dir); 
    } 
    else { 
     //could not open directory 
     printf("Error opening directory"); 
    } 
    return 0; 
} 

ここで書かれている言語はCであり、C++ではありません。

関連する問題