ifstream: проверьте, успешно ли открыт - PullRequest
35 голосов
/ 17 ноября 2010

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

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

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

Ответы [ 4 ]

44 голосов
/ 17 ноября 2010

operator! перегружен для std::ifstream, поэтому вы можете сделать это.

Однако, на мой взгляд, это ужасное злоупотребление перегрузкой операторов (комитетом по стандартам). Гораздо более ясно, что вы проверяете, если вы просто делаете if (stream.fail()).

11 голосов
/ 24 января 2012

Вы можете заставить определенный поток генерировать исключение для любого из eof / fail / bad, вызывая его ios :: exceptions () с соответствующей битовой маской.Таким образом, вы могли бы переписать пример в начальном вопросе выше как:

std::ifstream stream;
stream.exceptions(std::ios::failbit | std::ios::badbit);
stream.open(filename.c_str());

Здесь поток будет выдавать исключение, когда бит-бит или битбит установлены.Например, если ifstream :: open () терпит неудачу, он установит бит ошибки и выдаст исключение.Конечно, это вызовет исключение позже, если какой-либо из этих битов будет установлен в потоке, так что это перезапись не совсем совпадает с первоначальным примером.Вы можете позвонить

stream.exceptions(std::ios::goodbit);

, чтобы отменить все исключения в потоке и вернуться к проверке ошибок.

10 голосов
/ 17 ноября 2010

Вы также можете использовать is_open () для проверки работоспособности, но!разрешено (это не проверка на ноль, это специальная перегрузка! )

edit:
Просто из интереса - почему это не вызывает исключение?
Это просто, что потоки были введены до исключений
или мы находимся в старом C ++ - это только ошибка, не настолько исключительная, чтобы быть исключением.

3 голосов
/ 03 апреля 2015

Ваш коллега неправильно . Возможно, он забыл, что ты не пишешь C.

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

...