Каждый поток (в том числе стандартный) в каждый момент времени находится в некотором состоянии. Эти состояния имеют названия good, bad, fail и eof (end-of-file — конец файла). Сами состояния определены в классе ios__base как целые статические константы, называемые флагами состояния потока (см. п. п. 27.4.2.1.3 в [1]):
typedef int iostate;
goodbit = 0x00
badbit = 0x01
eofbit = 0x02
failbit = 0x04
Значения флагов зависят от реализации (показанные значения флагам присвоены в системе С++ Builder 6), однако имена определены в стандарте, поэтому именно так флаги состояния называются во всех без исключения системах. В программе имена флагов состояния нужно записывать с префиксом, например:
std: : ios_base: : eof bi t
С таким же успехом можно использовать класс, производный от ios_base. В частности, в текстах программ стандартной библиотеки часто встречается более короткий префикс:
std::ios::eofbit
В базовом классе ios_base определено поле
iostate _M_iostate; // библиотека STLport
ПРИМЕЧАНИЕ
Такое имя поле имеет в системе Borland С++ Builder 6. В другой реализации имя поля может быть другим.
В этом поле сохраняются флаги состояния во время работы программы. Это поле мы можем прочитать методом
iostate rdstateO ;
Установить любой флаг можно методом void setstate(iostate flag);
Для установки нескольких флагов, естественно, нужно воспользоваться битовыми операциями, например:
setstate(std::ios::eofbit | std::ios::faiIbit);
Система ввода-вывода С++ предоставляет несколько методов, с помощью которых мы всегда можем узнать состояние потока:
bool good() const; // следующая операция может выполняться bool eof() const; // окончание ввода bool fail() const; // следующая операция не выполняется bool bad() const; // поток испорчен
Если после выполнения некоторой операции поток находится в состоянии good, это означает, что во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операции ввода-вывода. В остальных случаях следующая операция выполнена не будет.
Состояния fail и bad являются состояниями ошибки потока. Если поток находится в одном из этих состояний, то операции обмена не выполняются. Состояние bad включает в себя состояние fail: когда поток находится в состоянии bad, он находится и в состоянии fail; обратное неверно.
Если поток находится в состоянии f ai 1, то операция ввода-вывода завершилась неудачно, однако поток не испорчен и никакие символы не потеряны. Обычно это состояние устанавливается при ошибках форматирования в процессе чтения, например, когда программа пытается прочитать целое число, а первый же символ (буква или знак операции) оказывается недопустимым. Поток из состояния fail мы можем вернуть в нормальное состояние с помощью метода с 1 е а г (), например:
if (stream.fail()) stream.clear();
После этого можно выполнять операции обмена — опять до очередной ошибки. Метод clear () перегружен и позволяет не только сбрасывать, но и устанавливать нужные флаги состояния. Прототип этого метода:
void clear(iostate flag):
Состояние bad — это более тяжелое состояние. Флаг badbi t указывает на неработоспособность потока данных или потерю данных. Когда поток оказывается в состоянии bad, ни в чем нельзя быть уверенным, поэтому в таких случаях лучше завершить выполнение программы.
Состояние eof может возникнуть только при операции чтения. Для стандартного потока ввода это состояние возникает при нажатии комбинации клавиш Ctrl+Z. Для файлов это состояние устанавливается при первой попытке чтения после последнего байта файла. При этом поток тоже переводится в состояние fail. |