Подтвердить что ты не робот

Ifstream: как определить, не существует ли указанного файла

Я хочу открыть файл для чтения. Однако, в контексте этой программы, это нормально, если файл не существует, я просто двигаюсь дальше. Я хочу, чтобы определить, когда ошибка "файл не найден", и когда ошибка в противном случае. В противном случае мне нужно выйти и ошибка.

Я не вижу очевидного способа сделать это с помощью fstream.


Я могу сделать это с помощью C open() и perror(). Я предположил, что существует способ fstream сделать это.

4b9b3361

Ответ 1

Поскольку результат открытия файла зависит от ОС, я не думаю, что стандартный С++ имеет какой-либо способ дифференцировать различные типы ошибок. Файл открывается или не открывается.

Вы можете попробовать открыть файл для чтения, и если он не открывается, вы знаете, что он либо не существует, либо произошла какая-либо другая ошибка. Опять же, если вы попытаетесь открыть его для записи позже, и это не удастся, это может попасть под категорию "что-то еще".

Ответ 2

EDIT: мне сообщили, что это не обязательно означает, что файл не существует, поскольку он может быть помечен из-за прав доступа или других проблем.

Я знаю, что я очень поздно отвечаю на это, но я решил, что оставил комментарий в любом случае для тех, кто просматривает. Вы можете использовать индикатор сбоя ifstream, чтобы указать, существует ли файл.

ifstream myFile("filename.txt");
    if(myFile.fail()){
        //File does not exist code here
    }
//otherwise, file exists

Ответ 3

Я не думаю, что вы можете знать, "файл не существует". Вы можете использовать is_open() для общей проверки:

ofstream file(....);
if(!file.is_open())
{
  // error! maybe the file doesn't exist.
}

Если вы используете boost, вы можете использовать boost::filesystem:

#include <boost/filesystem.hpp>
int main()
{
    boost::filesystem::path myfile("test.dat");

    if( !boost::filesystem::exists(myfile) )
    {
        // what do you want to do if the file doesn't exist 
    }
}

Ответ 5

Вы можете использовать stat, который должен быть переносимым на разных платформах и находится в стандартной библиотеке C:

#include <sys/stat.h>

bool FileExists(string filename) {
    struct stat fileInfo;
    return stat(filename.c_str(), &fileInfo) == 0;
}

Если stat возвращает 0, файл (или каталог) существует, иначе это не так. Я предполагаю, что вам придется иметь права доступа для всех каталогов в пути к файлу. Я не тестировал переносимость, но эта страница предполагает, что это не должно быть проблемой.

Ответ 6

Лучший способ:

std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);

Ответ 7

Функция std::fstream::good() возвращает false по нескольким причинам, в том числе, когда файл не существует. Разве этого не достаточно?

std::fstream наследует эту функцию от std::ios.

Ответ 8

Прямой путь без создания объекта ifstream.

if (!std::ifstream(filename))
{
     // error! file doesn't exist.
}

Ответ 9

Позвольте мне привести пример с реальным бегом:

  1. файл не существует:

enter image description here

  1. файл существует:

enter image description here

см. http://www.cplusplus.com/reference/fstream/ifstream/ для получения дополнительной информации о его общедоступной функции.