2016-04-05 1 views
0

Я использую dirent.h в C++, чтобы получить доступные каталоги и файлы в моем каталоге, что он перечисляет в дополнение к доступным каталогам и файлам «.». и ".." Чтобы удалить их, я добавил инструкцию 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; 
} 

BTW, язык, на котором эта программа написана, является C, а не C++.

Смежные вопросы