Скачиваний:
185
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

14. Заголовочный файл iomanip. Функции setprecision(), setfill(), setw(). Использование манипуляторов из файла iomanip.

При установке некоторых значений форматирования, таких как ширина поля, использовать средства iostream неудобно. Для упрощения задачи C++ предлагает дополнительные манипуляторы в заголовочном файле iomanip. Они обеспечивают те же функциональные средства, что и рассмотренные выше, но более удобным образом. Три наиболее часто используемые из них функции — это setprecision() для установки точности, setfill() для установки символа-заполнителя и setw() для установки ширины поля. В отличие от ранее рассмотренных манипуляторов, эти принимают аргументы. Манипулятор setprecision() принимает целочисленный аргумент, задающий точность, setfill() принимает аргумент типа char, указывающий символзаполнитель, a setw() принимает целочисленный аргумент, устанавливающий ширину поля.

15. Понятие состояния потока. Набор констант типа iostate (константы состояния потока), решаемые ими задачи. Методы для получения установки состояния потока. Примеры использования. Взаимосвязь ввода/вывода и обработки исключительных ситуаций.

Состояние потока, определенное как тип iostate, представляет собой тип битовой маски, которых состоит из четырех элементов ios_base: badbit, eofbit, failbit, goodbit.

Каждый элемент — это отдельный бит, который может принимать значение 1 (установлен) или 0 (сброшен). Когда операция cin достигает конца файла, она устанавливает eofbit в 1. Когда операция cin не может прочитать ожидаемые символы, она устанавливает failbit в 1. Сбои ввода-вывода, вроде попытки чтения недоступного файла или попытки записи на защищенный от записи диск, также могут привести к установке failbit в 1. Элемент badbit устанавливается в 1, когда происходит некоторый не поддающийся диагностике сбой, который может повредить поток.

Когда все эти три бита состояния установлены в 0, все в порядке.

Методы clear() и setstate() — являются аналогичными. Они оба сбрасывают состояние, но делают это по-разному. Метод clear() устанавливает состояние в соответствии с переданным ему аргументом. Поэтому следующий вызов использует аргумент по умолчанию 0, который очищает все три бита состояния (eofbit, badbit и failbit): clear();

Подобным же образом следующий вызов делает состояние равным eofbit; т.е. бит eofbit устанавливается, а остальные два бита очищаются: clear(eofbit);

Однако метод setstate() воздействует только на те биты, которые установлены в его аргументе. Таким образом, следующий вызов устанавливает eofbit, не затрагивая остальных битов: setstate(eofbit);

Взаимосвязь ввода/вывода и обработки исключительных ситуаций.

Метод exceptions() возвращает битовое поле с тремя битами, соответствующими eofbit, failbit и badbit. Изменение состояния потока ведет к применению либо метода clear(), либо метода setstate(), который использует clear(). После изменения состояния потока метод clear() сравнивает его текущее состояние со значением, возвращенным exceptions(). Если бит установлен в возвращаемом значении, и соответствующий бит установлен также в текущем состоянии, то clear() генерирует исключение ios_base::failure. Это может случиться, например, если оба значения имеют установленный бит badbit. Отсюда следует, что если exceptions() возвращает goodbit, то исключение не генерируется.