Ifstream: проверить, успешно ли открыт
Коллега просто сказал мне, что этот код:
std::ifstream stream(filename.c_str());
if (!stream)
{
throw std::runtime_error("..");
}
было бы неправильно. Он сказал, что ifstream
оценивает 0, если открытие успешно. Мой код работает, но я хотел найти документацию, но не видел, где говорится, как проверить успешность открытия. Можете ли вы указать мне на это?
Ответы
Ответ 1
operator!
перегружен для std::ifstream
, поэтому вы можете это сделать.
По-моему, это ужасное злоупотребление перегрузкой оператора (комитетом по стандартам). Это гораздо более явное, что вы проверяете, если вы просто делаете if (stream.fail())
.
Ответ 2
Вы также можете использовать is_open(), чтобы проверить, не сработало ли оно, но! (он не проверяет нуль, это специальная перегрузка!)
Редактирование:
Просто из интереса - почему это не исключение?
Разве только потоки были введены перед исключениями
или мы в старую вещь С++ - это только ошибка, которая не является исключительной, чтобы быть исключением.
Ответ 3
Вы можете сделать конкретный поток, генерирующий исключение в любом из eof/fail/bad, вызывая функцию ios:: exceptions() с соответствующей битовой маской. Итак, вы можете переписать пример в начальном вопросе выше:
std::ifstream stream;
stream.exceptions(std::ios::failbit | std::ios::badbit);
stream.open(filename.c_str());
Здесь поток генерирует исключение, когда битбит или битбит устанавливаются. Например, если ifstream:: open() не работает, он установит failbit и выдаст исключение. Конечно, это приведет к возникновению исключения позже, если любой из этих битов будет установлен в потоке, поэтому это переписывание не совсем совпадает с исходным примером. Вы можете позвонить
stream.exceptions(std::ios::goodbit);
чтобы отменить все исключения в потоке и вернуться к проверке ошибок.
Ответ 4
Ваш коллега ошибается. Возможно, он забыл, что вы не пишете C.
Код находится на месте. Это точно, как вы должны проверять состояние потока.