Здравствуйте, имеется вот такая функция, рекурсивно получаю список файлов в директориях, возникла потребность передать директорию в другую функцию, типы соблюдаю 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.
Дан следующий прототип функции, которая должна возвращать вектор всех делителей числа x в отсортированном порядке за O(n^1/2):
Давно учил С++, уже его подзабыл, но сейчас необходимо решить заданиеБуду благодарен любой помощи!
Создаю на плюсах нестандартное окно по png рисунку через UpdateLayeredWindowКак на этом окне отобразить стандартные контролы? В частности меня интересуют...