ifstream::is_open возвращает значение true, даже если файл не существует в местоположении

#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 . Я удалил файл, и у меня это сработало. Спасибо, что указали мне правильный путь.