Здравствуйте, имеется вот такая функция, рекурсивно получаю список файлов в директориях, возникла потребность передать директорию в другую функцию, типы соблюдаю d_name в который получаю имя директории с типом char передаю в char, только в другой функции как не мудрил с указателями получаю либо пустоту либо байт код, подскажите как правильно это сделать?
int getdir(string dir, vector<string> &files)
{
// Указатель каталога
DIR *dp;
// Структура каталога
struct dirent *dirp;
// Попытаться открыть каталог
if ((dp = opendir(dir.c_str())) == NULL)
{
cout << "Error(" << errno << ") opening " << dir << endl;
return errno;
}
// Обход каждого файла в каталоге
while ((dirp = readdir(dp)) != NULL)
{
// Если обнаружен каталог, то рекурсивное чтение из него
if (dirp->d_type == DT_DIR && strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0)
{
string p = dir + "/" + dirp->d_name;
getdir(p, files);
}
// Пропуск скрытых файлов
else if (dirp->d_type == DT_REG && string(dirp->d_name).substr(0, 1) == ".")
{
continue;
}
// Добавление файлов в список
else if (dirp->d_type == DT_REG)
{
files.push_back(string(dirp->d_name));
}
}
// Закрывает указать директории
closedir(dp);
return 0;
}
Судя по всему, у вас ошибка в этой строке:
string p = dir + "/" + dirp->d_name;
dirp->d_name, имеет тип char*, строка "/" неявно преобразуется в const char*, в итоге происходит сложение указателей, а не строк. Советую не мешать c и c++, и везде использовать std::string, ну или хотя бы приводить строки к ним. strcmp тоже лучше заменить на сравнение std::string.
А закрытие каталога лучше отдать под управление умного указателя:
using dir_ptr_t = std::unique_ptr<DIR, decltype(&closedir)>;
dir_ptr_t dp (opendir(dir.c_str()), &closedir); // Второй аргумент - указатель на функцию, которая осуществдляет удаление
if(dp){
...
}
EDIT: Оператор + всё же имеет ассоциативность слева на право, т. е. там будет неявное преобразование в std::string и строки сложатся правильно. Но лучше явно указывать, что указатель на char переводится в std::string.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники