2010-11-17 2 views
21

коллега только что сказал мне, что этот код:ifstream: проверить, успешно открыт

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

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

ответ

29

operator!is overloaded для std::ifstream, так что вы можете сделать это.

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

+6

не забудьте проверить 'stream.bad()', 'stream.good()', 'stream.fail()' и 'stream.is_open()'. вздох ... – Inverse

+0

Большое спасибо за ссылку! Я согласен с тем, что делать этот чек с помощью этого оператора неплохо, поэтому я его изменю. У нас не было бы обсуждения с if (stream.fail()). – Philipp

+9

The! перегружен, чтобы проверить «fail» и «bad» –

8

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

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

8

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

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

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

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

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

2

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

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

Смежные вопросы