Почему не, действительно? Мой опыт, получающий мою степень CS, был в значительной степени тем же. Причина состоит в том, что люди, которые преподают программирование, не программируют, насколько я могу сказать. Это не требуется, чтобы учить, что материал для аккредитации, учителя не знакомы с ним, и студенты никогда не разрабатывают проекты никакого значения как часть их курсовой работы. Нет никакой мотивации для фактического обучения программирования, в противоположность обучающей теории CS или синтаксису Java.
Вы должны установить бит fail
. Если пользователь потока хочет, чтобы генерировалось исключение, он может настроить поток (используя istream :: exceptions
), и поток будет генерировать соответствующий запрос. Я бы сделал это так, тогда
stream.setstate(ios_base::failbit);
Для искаженных данных, которые не соответствуют формату, который вы хотите прочитать, вы обычно должны установить сбой
бит. Для ошибок, специфичных для внутреннего потока, используется бит bad
(например, если к потоку не подключен буфер).
Я не слышал о таком.
Чтобы проверить, находится ли поток в хорошем состоянии, можно использовать класс istream :: sentry
. Создайте его объект, передав поток и true
(чтобы он не пропускал пробелы сразу). Часовой будет иметь значение false
, если установлен бит eof
, fail
или bad
.
istream::sentry s(stream, true);
if(!s) return stream;
// now, go on extracting data...
Некоторые дополнительные примечания:
при реализации оператора >> вам, вероятно, следует рассмотреть возможность использования bufstream, а не другие перегрузки оператора >>;
исключения, возникающие во время операции, должны быть преобразованы в failbit или badbit (члены streambuf могут выбросить, в зависимости от class used);
установка состояния может бросить; если вы установите состояние после ловли исключение, вы должны распространять исходное исключение, а не одно выброшено setstate;
ширина - это поле, на которое вы должны обратить внимание. Если ты с учетом этого следует сбросить его на 0. Если вы используете другие оператор >> для выполнения основных работ вам необходимо вычислить ширину, которую вы передаете из полученного;
рассмотрите возможность принятия во внимание языкового стандарта.
Ланге и Крефт ( Стандартные потоки и локали IOS C ++ ) преобразуют его в четный подробнее. Они предоставляют шаблонный код для обработки ошибок, которая требует около одной страницы.
Что касается флагов, я не знаю, есть ли где-нибудь какие-либо стандарты, но их можно сбросить.
Boost имеет для этого аккуратные оболочки raii: IO State Savers