Почему 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());