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

Ifstream: проверить, успешно ли открыт

Коллега просто сказал мне, что этот код:

std::ifstream stream(filename.c_str());
if (!stream)
{
    throw std::runtime_error("..");
}

было бы неправильно. Он сказал, что ifstream оценивает 0, если открытие успешно. Мой код работает, но я хотел найти документацию, но не видел, где говорится, как проверить успешность открытия. Можете ли вы указать мне на это?

4b9b3361

Ответ 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.

Код находится на месте. Это точно, как вы должны проверять состояние потока.