|
Программирование >> Операторы преобразования типа
Таблица 13.3. Константы типа iostate Константа Описание goodbit Нормальное состояние потока данных, другие биты не установлены eofbit Обнаружен признак конца файла failbit Ошибка; операция ввода-вывода завершилась неудачно badbit Фатальная ошибка, неопределенное состояние потока данных Бит goodbit по определению равен 0. Таким образом, установка флага goodbit означает, что все оста.льные биты также равны 0. Имя goodbit выбрано не совсем удачно, поскольку нормальное состояние потока данных обозначается не установкой отдельного бита, а сбросом всех остальных битов. Основное отличие флагов failbit и badbit состоит в том, что badbit обозначает более серьезную ошибку. О флаг failbit устанавливается в том случае, если операция завершилась неудачно, но состояние потока данных позволяет продолжить работу. Обычно этот флаг устанавливается при ошибках форматирования в процессе чтения - например, если прохрамма пытается прочитать целое число, а следующий символ является буквой. О флаг badbit указывает на неработоспособность потока данных или потерю данных, например, при установке указателя в файловом потоке данных перед началом файла. Флаг eofbit обычно устанавливается вместе с failbit, поскольку признак конца файла проверяется и обнаруживается при попытке чтения за контом файла. После чтения последнего символа флаг eofbit не устанавливается, он устанавливается вместе с флагом failbit при следующей попытке чтения символа. В некоторых старых реализациях также определен флаг hardfall. Стандартом этот флаг не поддерживается. Константы флагов определяются не глобально, а в классе ios base. Это означает, что они всегда должны использоваться с указанием области видимости или с конкретным объектом. Пример: std::ios base::eofb1t Конечно, с таким же успехом можно использовать класс, производный от ios base. В старых реализациях эти константы определялись в классе ios. Поскольку тип ios является производным от ios base, а его имя вводится быстрее, в программах часто встречаются конструкции вида: std::1os::eofbit Флаги определены в базовом классе basic ios, поэтому оии присутствуют во всех объектах типов basicjstream и basic ostreain. С другой стороны, потоковые буферы состояния не имеют. Один буфер может совместно использоваться несколькими потоковыми объектами, поэтому флаги представляют только состояние потока данных в результате последней операции и только в случае, если перед операцрхей поток данных был приведен в состояние goodbit. В противном случае может оказаться, что флаги были установлены одной из предтне-ствующих операций. функции для работы с состоянием потока данных в табл. 13.4 перечислены функции для работы с текущим состоянием потока данных. Таблица 13.4. Функции для работы с состоянием потока данных Функция Описание good() Возвращает true, если поток данных находится в нормальном состоянии (то есть при установке флага goodbit) eof() Возвращает tme при обнаружении признака конца файла (установка флага eofbit) fail() Возвращает true при обнаружении ошибки (установка флага failbit или badbit) bad() Возвращает true при обнаружении фатальной ошибки (установка флага badbit) rdstateO Возвращает установленные флаги с1еаг() Сбрасывает все флаги clear(state) Сбрасывает все флаги и устанавливает флаги, содержащиеся в state setstate(state) Устанавливает флаги, содержащиеся в state Первые четыре функции проверяют состояние отдельных флагов и возвращают логическую 1*еличину. Учтите, что функция fail() возвращает true при установке как failbit, так и badbit. Хотя такое поведентте объясняется в основном историческими причинами, у него есть определенные достоинства - для выявления ошибки достаточно проверить всего одно условие. Также существуют более общие функции для проверки и изменения состояния флагов. При вызове функции с1еаг() без параметров сбрасываются все флаги ошибок (в том числе и eofbit): Сброс всех флагов ошибок (включая eofbit) strm.clearO; Если функция с1еаг() вызывается с передачей параметра, то состояние потока данных изменяется в соответствии с переданным значением; переданные флаги устанавливаются для потока данных, а остальные флаги сбрасываются. У этого правила есть единственное исключение: при отсутствии потокови1 о буфера (когда rdbuf()==0) флаг badbit устанавливается всегда; за подробностями обращайтесь к с. 613. Следующий пример показывает, как установить и сбросить флаг failbit: Проверка установки флага failbit If (strm.rdstateO & std::1os::fa11b1t) { std;:cout failbit was set std::endl: Сброс только флага failbit strm.clear (strm.rdstateO & -std::1os::failb1t): В этом примере используются поразрядные операторы & и Оператор возвращает поразрядное дополнение своего аргумента. Следовательно, показанное ниже выражение возвращает временное значение, в котором установлены все биты, кроме failbit: -ios::fa1lbit Оператор & возвращает результат поразрядного объединения своих операндов. В результате операции устанавливаются только биты, установленные в обоих операндах. При поразрядном объединении всех текущих установленных флагов (rdstateO) со всеми установленными битами, кроме failbit, бит failbit сбрасывается, а значения всех остальных битов сохраняются. Потоки данных можно настроить так, чтобы при установке флагов функциями с1еаг() и setstateO генерировались исключения (см. с. 576). Также следует помнить о необходимости явного сброса битов ошибок. Язык С позволял продолжить чтение символов после ошибки форматирования. Например, если функции scanf() не удавалось прочитать целое число, программа могла ввести оставшиеся символы. Таким образом, операция чтения завершалась неудачей, но входной поток данных оставался в нормальном состоянии. В С++ дело обстоит иначе. При установке бита failbit все последующие операции с потоком данных игнорируются до тех пор, пока флаг failbit не будет сброшен программой. Вообще говоря, установленные флаги всего лишь отражают события, которые происходили в прошлом. Наличие установленного флага после какой-либо операции не всегда означает, что именно эта операция привела к его установке. Флаг также мог быть установлен еще до выполнения этой операции. Следовательно, если вы собираетесь проверять результат выполнения операции по состоянию флагов, перед ее выполнением следует привести поток данных к состоянию goodbit (если нет полной уверенности в том, что он уже находится в этом состоянии). Кроме того, после сброса флагов операция может верпуть другой результат. Например, даже если флаг eofbit в результате операции был установлен, это еще не означает, что после сброса eofbit (и всех остальных установленных битов) флаг будет снова установлен при повторном выиолнении операции, поскольку между вызовами файл может увеличиться. Состояние потока данных и логические условия в табл. 13.5 приведены две операторные функции, предназначенные для проверки состояния потоков данных в логических выражениях. Таблица 13.5. Потоковые операторы для логических выражений Функция Описание operator void*() Проверяет нормальное состояние потока данных (эквивалент !fail()) operator! () Проверяет ошибочное состояние потока данных (эквивалент fail())
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |