Ifstream: как определить, не существует ли указанного файла
Я хочу открыть файл для чтения. Однако, в контексте этой программы, это нормально, если файл не существует, я просто двигаюсь дальше. Я хочу, чтобы определить, когда ошибка "файл не найден", и когда ошибка в противном случае. В противном случае мне нужно выйти и ошибка.
Я не вижу очевидного способа сделать это с помощью fstream
.
Я могу сделать это с помощью C open()
и perror()
. Я предположил, что существует способ fstream
сделать это.
Ответы
Ответ 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
}
}
Ответ 4
Простой способ с http://www.cplusplus.com/forum/general/1796/
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
Ответ 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
Позвольте мне привести пример с реальным бегом:
- файл не существует:
![enter image description here]()
- файл существует:
![enter image description here]()
см. http://www.cplusplus.com/reference/fstream/ifstream/ для получения дополнительной информации о его общедоступной функции.