Безопасно перегружающийся потоковый оператор>>

Почему не, действительно? Мой опыт, получающий мою степень CS, был в значительной степени тем же. Причина состоит в том, что люди, которые преподают программирование, не программируют, насколько я могу сказать. Это не требуется, чтобы учить, что материал для аккредитации, учителя не знакомы с ним, и студенты никогда не разрабатывают проекты никакого значения как часть их курсовой работы. Нет никакой мотивации для фактического обучения программирования, в противоположность обучающей теории CS или синтаксису Java.

15
задан Michael Koval 15 August 2009 в 01:01
поделиться

3 ответа

  1. Как указать недопустимые данные в потоке? Вызвать исключение?

Вы должны установить бит fail . Если пользователь потока хочет, чтобы генерировалось исключение, он может настроить поток (используя istream :: exceptions ), и поток будет генерировать соответствующий запрос. Я бы сделал это так, тогда

stream.setstate(ios_base::failbit);
  1. В каком состоянии должен быть поток, если в потоке есть искаженные данные?

Для искаженных данных, которые не соответствуют формату, который вы хотите прочитать, вы обычно должны установить сбой бит. Для ошибок, специфичных для внутреннего потока, используется бит bad (например, если к потоку не подключен буфер).

  1. Нужно ли сбрасывать какие-либо флаги перед возвратом ссылки для связывания операторов?

Я не слышал о таком.


Чтобы проверить, находится ли поток в хорошем состоянии, можно использовать класс istream :: sentry . Создайте его объект, передав поток и true (чтобы он не пропускал пробелы сразу). Часовой будет иметь значение false , если установлен бит eof , fail или bad .

istream::sentry s(stream, true);
if(!s) return stream;
// now, go on extracting data...
18
ответ дан 1 December 2019 в 03:43
поделиться

Некоторые дополнительные примечания:

  • при реализации оператора >> вам, вероятно, следует рассмотреть возможность использования bufstream, а не другие перегрузки оператора >>;

  • исключения, возникающие во время операции, должны быть преобразованы в failbit или badbit (члены streambuf могут выбросить, в зависимости от class used);

  • установка состояния может бросить; если вы установите состояние после ловли исключение, вы должны распространять исходное исключение, а не одно выброшено setstate;

  • ширина - это поле, на которое вы должны обратить внимание. Если ты с учетом этого следует сбросить его на 0. Если вы используете другие оператор >> для выполнения основных работ вам необходимо вычислить ширину, которую вы передаете из полученного;

  • рассмотрите возможность принятия во внимание языкового стандарта.

Ланге и Крефт ( Стандартные потоки и локали IOS C ++ ) преобразуют его в четный подробнее. Они предоставляют шаблонный код для обработки ошибок, которая требует около одной страницы.

2
ответ дан 1 December 2019 в 03:43
поделиться

Что касается флагов, я не знаю, есть ли где-нибудь какие-либо стандарты, но их можно сбросить.

Boost имеет для этого аккуратные оболочки raii: IO State Savers

0
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: