0

我在 C++ 中使用 dirent.h 以获取我的目录中的可用目录和文件,除了可用目录和文件之外,它还列出了一个“。” 和“..”为了删除它们,我在打印之前添加了一个 if 语句。代码如下:

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 *** 中止(核心转储)”我该如何解决?

4

1 回答 1

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++。

于 2016-04-05T18:38:47.803 回答