Почему opendir() не открывает путь после преобразования типа пути с помощью c_str()?

Я пытаюсь открыть каталог, имя которого (путь) в настоящее время находится в std::string, изначально считанном из файла.csv (хотя я не думаю, что это что-то меняет в самой строке). Вызов opendir(path.c_str()) возвращает NULL. Я попробовал следующий код, делая преобразование вне opendir():

DIR *dir;
bool first = True;
string level = "";
struct dirent *ent;

const char * c = path.c_str();
// A
if ((dir = opendir(c)) != NULL){
    // do stuff
    // should open the directory and go here
}else{
    // always ends up here
}

Хотя это и не удалось с path="LeanDataBase", каталог в папке проекта, заменяющий opendir("LeanDataBase") на opendir(c), по-видимому, открывает каталог. Однако эта функция рекурсивна, поэтому я не могу жестко закодировать это значение, иначе оно не будет работать и попадет в бесконечный цикл.

Я также попытался напечатать типы со следующими двумя строками, вставленными сразу после "A" в предыдущем коде:

cout << typeid(c).name() << endl;
cout << typeid("LeanDataBase").name() << endl;

Что дало следующий вывод:

PKc
A13_c

Означает ли это, что я передаю неправильный тип в opendir()? Кажется, что он может обрабатывать PKc, но не A13_c. Есть ли способ преобразовать строку пути в правильный тип?

1 ответ

Глядя на свой хрустальный шар, я вижу следующую проблему: путь изменяется (или даже покидает область видимости) после path.c_str() называется, но раньше opendir() называется. Запоминать результат c_str() в любой переменной, так как это приводит к таким проблемам. c_str() предназначен для использования на месте, как следующие

opendir(path.c_str());
Другие вопросы по тегам