#c
#c
Вопрос:
У меня есть функция, которая в основном открывает файл из местоположения и анализирует значение, доступное в файле, в некоторой структуре, используемой в некоторых других местах исходного кода. Проблема здесь в том, что даже если файл недоступен в указанном местоположении, ifstream::isopen возвращает значение true.
Вместо использования конструктора я попытался использовать ifstream::open, чтобы явно открыть файл, но, к сожалению, это не сработало.
bool ClassName::loadRecordingConfiguration()
{
std::string filepathConfig = getDataFolder() std::string("\file.json");
std::ifstream jsonFile(filepathConfig.c_str());
if (jsonFile.is_open()) {
//This part is executed when getDataFolder failed to return the folder path and file.json is not available
//This part is also executed when getDataFolder returns correct folder path and file.json is available
}
}
//Returns the folder path if SomeCondition is satisfied
std::string ClassName::getDataFolder()
{
if (SomeCondition) {
return std::string(SomeFilePath);
}
return std::string("");
}
Поскольку путь к папке неверен, я ожидаю, что он будет работать только тогда, когда у меня есть файл.json, размещенный в расположении soomeFilePath.
Комментарии:
1. При
getDataFolder()
сбое возвращает ли он пустое значение, подобное отображаемому? Если да, вы проверили, что он./file.json
не существует, где.
обозначает рабочий каталог, в котором выполняется программа? Илиfile.json
не существует вообще — ноis_open()
все еще возвращаетсяtrue
? Кроме того, заполнение имен заполнителей и отображение более или менее текущего дерева каталогов для получения минимального рабочего примера помогло бы.2. Вы говорите: «Вместо использования конструктора я использовал ifstream::open, чтобы явно открыть файл». Но в вашем примере вы используете constructor, чтобы открыть его на самом деле.
std::ifstream jsonFile(filepathConfig.c_str());
3. @anakhand да, при сбое getDataFolder возвращается пустая строка, как показано. Я обеспечил этот файл. json нигде не существует в рабочем каталоге..
4. @Oliort Я снова обновил комментарии. Извините за неправильное описание
5. Есть идеи, как ifstream выглядит, чтобы открыть файл, если указанный файл недоступен в пути??
Ответ №1:
Попробуйте использовать operator bool
( if (jsonFile){ ... }
) или проверить флаги потока (badbit, failbit). Открытие файла — операция, зависящая от конкретной операционной системы, и ifstream::is_open()
проверяется, удалось ли создать дескриптор файла.
В любом случае лучше сначала проверить, присутствует ли он в каком-либо API ОС (PathFileExistsA для Windows, например).
Комментарии:
1. Существует
ifstream::good()
, который проверяет все биты ошибки одновременно.2. @oliort Я нашел проблему. Когда getDataFolder() возвращает NULL filepathConfig=file.json. С помощью GetFullPathName API я нашел абсолютный путь, и файл был взят из текущего каталога, который в моем случае был U:file.json . Я удалил файл, и у меня это сработало. Спасибо, что указали мне правильный путь.