Шаг 473.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Состояние потока данных. Константы состояния потока данных

    На этом шаге мы рассмотрим флаги, определяющие состояние потока данных.

    Потоки данных обладают определенным состоянием. В частности, состояние показывает, успешно или нет была выполнена операция ввода-вывода, а если нет - то почему.

Константы состояния потока данных

    Общее состояние потока данных определяется несколькими флагами, представленными константами типа iostate (таблица 1). Тип iostate определяется в классе ios_base. Конкретный тип констант зависит от реализации (иначе говоря, стандарт не указывает, является тип iostate перечислением, определением целочисленного типа или специализацией класса bitset).

Таблица 1. Константы типа iostate
Константа Описание
goodbit Нормальное состояние потока данных, другие биты не установлены
eofbit Обнаружен признак конца файла
failbit Ошибка; операция ввода-вывода завершилась неудачно
badbit Фатальная ошибка, неопределенное состояние потока данных

    Бит goodbit по определению равен 0. Таким образом, установка флага goodbit означает, что все остальные биты также равны 0. Имя goodbit выбрано не совсем удачно, поскольку нормальное состояние потока данных обозначается не установкой отдельного бита, а сбросом всех остальных битов.

    Основное отличие флагов failbit и badbit состоит в том, что badbit обозначает более серьезную ошибку.

    Флаг eofbit обычно устанавливается вместе с failbit, поскольку признак конца файла проверяется и обнаруживается при попытке чтения за концом файла. После чтения последнего символа флаг eofbit не устанавливается, он устанавливается вместе с флагом failbit при следующей попытке чтения символа.

    В некоторых старых реализациях также определен флаг hardfail. Стандартом этот флаг не поддерживается.

    Константы флагов определяются не глобально, а в классе ios_base. Это означает, что они всегда должны использоваться с указанием области видимости или с конкретным объектом. Пример:

  std::ios_base::eofbit

    Конечно, с таким же успехом можно использовать класс, производный от ios_base. В старых реализациях эти константы определялись в классе ios. Поскольку тип ios является производным от ios_base, а его имя вводится быстрее, в программах часто встречаются конструкции вида:

  std::ios::eofbit

    Флаги определены в базовом классе basic_ios, поэтому они присутствуют во всех объектах типов basic_istream и basic_ostream. С другой стороны, потоковые буферы состояния не имеют. Один буфер может совместно использоваться несколькими потоковыми объектами, поэтому флаги представляют только состояние потока данных в результате последней операции и только в случае, если перед операцией поток данных был приведен в состояние goodbit. В противном случае может оказаться, что флаги были установлены одной из предшествующих операций.

    На следующем шаге мы рассмотрим функции для работы с состоянием потока данных.




Предыдущий шаг Содержание Следующий шаг