2015-09-30 2 views
0

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

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 
} 

В то время как это не удалось с пути = «LeanDataBase», каталог в папке проекта, заменив opendir («LeanDataBase») для opendir (с), похоже, открывает каталог. Однако эта функция рекурсивна, поэтому я не могу жестко закодировать это значение или она не работает и попадает в бесконечный цикл.

Я также попытался печати типов, со следующими двумя линиями, вставленных сразу после «А» в предыдущем коде:

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

которая дала следующие результаты:

PKc 
A13_c 

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

+2

И соответствующую информацию: какова * стоимость (текстовой) * из 'c' во время вызова? Поскольку указание строки работает (с известным значением), а 'c' имеет правильный тип, тогда вероятный виновник - это фактическое значение, указанное .. неожиданно/различно. – user2864740

+2

Также проверьте 'errno' –

+4

Психическое предсказание: Строка с ошибкой включает в себя символ новой строки и/или возврата каретки, который был в файле, который был прочитан, и не был удален. – ShadowRanger

ответ

4

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

opendir(path.c_str()); 
Смежные вопросы