Readdir и C++

174
15 декабря 2016, 16:00

Есть код, который я нашел на просторах интернета. Главная цель кода - показать все файлы в главной папке и подпапках. Всё работает вроде хорошо (пока не появится 3-я подпапка). Автор, у которого я этот код позаимствовал, тоже мучался с данной ошибкой, но он смог её решить (и выложил этот код как решение данной проблены), но у меня ошибка всё равно осталась. Я решил сделать (понатыкать) проверок. Первая проверка показала, что входя в 3-ю подпапку цикл начинает попросту "крутить" пустоту. Потом я добавил вторую проверку, которая мне показала, что вся проблема в типе. Код полностью готов для копипаста. Просьба помочь!

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <limits.h>
#include <string.h>
#include <sys/stat.h>
void nextdir (char folder[255])
{
    DIR *dir;
    struct dirent *entry;
    dir=opendir(folder);
    printf("Открытие папки %s (тип: %d)\n",folder,entry->d_type);
       while ((entry=readdir(dir))!=NULL){
            printf("_\n");
            if (entry->d_type!=4) printf("%s\n",entry->d_name);else
                if ((entry->d_type==4) && ((strcmp(entry->d_name,".")!=0) && (strcmp(entry->d_name,"..")!=0))){
                    folder=strcat(folder,"/");
                    nextdir(strcat(folder,entry->d_name));
                }
        }
    closedir(dir);
}
int main(int argc, char **argv)
{
    char filename[256];
    if ( argc < 2 ) strcpy(filename, ".");
            else strcpy(filename, argv[1]);
    printf("Корневой каталог %s\n\n", filename);
    nextdir(filename);
    return 0;
}
Answer 1

Хм.

nextdir(strcat(folder,entry->d_name));

Вы понимаете, что делает этот код? Он модифицирует folder на месте! Подумайте об этом, у вас всё время одна и та же область памяти для строки. Вы туда добавляете подкаталоги и никогда не удаляете по выходу из функции.

Не ленитесь, объявите параметр folder как const char, и выделяйте память для каждой новой строки.

И да, вы не детектируете ошибки, которые возвращают функции типа opendir. Вот почему никогда не стоит вслепую копипастить чужой код, не заглядывая в документацию.

Answer 2

@Georgy Linkovsky, это обычный (по своей идее) рекурсивный обход дерева в глубину (т.е. сразу как увидели каталог, так и перешли в него).

Только м.б. удобнее не конкатенировать имена оглавлений, а делать chdir(folder); сразу после opendir() (и вызывать просто nextdir(entry->d_name)), а перед возвратом вызывать chdir("..");

А у Вас что за идея (моделируете стек сами)?

READ ALSO
Ввод данных с клавиатуры

Ввод данных с клавиатуры

Здравствуйте

215
Является ли GLUT многозадачной?

Является ли GLUT многозадачной?

Изучаю библиотеку GLUTСоздаётся впечатление, что в GLUT отрисовка и события работают параллельно, создавая многозадачность?

171
Сервер и Thread не уживаются

Сервер и Thread не уживаются

Собираю маленький игровой сервер и никак не мог понять, почему он иногда не работает, почти один и тот же код в разных проектахИ вот методом...

149
OpenGl картинка отображается кверху ногами

OpenGl картинка отображается кверху ногами

Здравствуйте! Есть функция для отрисовки картинки:

142