передать значение локальной переменной в другую функцию

285
10 июля 2017, 18:03

Здравствуйте, имеется вот такая функция, рекурсивно получаю список файлов в директориях, возникла потребность передать директорию в другую функцию, типы соблюдаю 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;
}
Answer 1

Судя по всему, у вас ошибка в этой строке:

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.

READ ALSO
Все делители числа

Все делители числа

Дан следующий прототип функции, которая должна возвращать вектор всех делителей числа x в отсортированном порядке за O(n^1/2):

194
Приватный член в обьявлении

Приватный член в обьявлении

Есть не статический метод:

192
Небольшая программа на C++

Небольшая программа на C++

Давно учил С++, уже его подзабыл, но сейчас необходимо решить заданиеБуду благодарен любой помощи!

231
c++ UpdateLayeredWindow

c++ UpdateLayeredWindow

Создаю на плюсах нестандартное окно по png рисунку через UpdateLayeredWindowКак на этом окне отобразить стандартные контролы? В частности меня интересуют...

291