Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Потоки ввода-вывода.doc
Скачиваний:
0
Добавлен:
14.11.2019
Размер:
338.94 Кб
Скачать

Листинг 3. Форматирующие флаги потоков

////////////////////////////////////////////////////

// Flags.срр: Форматирующие флаги потоков.

//

#include <iostream.h>

#include <iomanip.h> #pragma hdrstop

#include <condefs.h>

#pragma argsused

int main(int argc, char* argv[])

{

//

// Демонстрация флага skipws. Если его сбросить, то при

// наличии начальных пробелов при вводе возникает ошибка.

//

long 1;

cout<< "Enter an integer: ";

cin.unsetf(ios::skipws);

cin >> 1;

if (cin) // При ошибке потока

cin == NULL. cout<< "You entered "<< 1<< endl;

else {

cout << "Incorrect input."<< endl;

cin.clear (); // Обнуление битов ошибки.

} cout<<endl;

//

// Демонстрация флагов основания и знака.

// Задается основание 16, вывод индикатора и знака +.

//

1 = 8191;

cout.setf(ios::hex, ios::basefield);

cout.setf(ios::showbase | ios::showpos);

cout << "hex: " <<1 << oct // Изменим основание

<< " oct: "<< 1 << dec // манипулятором.

<< " dec: " << 1 << endl;

cout << endl;

//

// Демонстрация флагов формата вещественных чисел.

//

double dl = 1.0е9, d2 = 34567.0;

cout <<"Default: " << dl << " "<<d2 << end1;

// Вывод десятичной точки. cout.setf(ios::showpoint);

cout << "Decimal: " << dl<< " " << d2 << endl;

// Нотация с фиксированной точкой.

// Заодно сбросим вывод знака +.

cout.setf(ios::fixed, ios::floatfield | ios::showpos);

cout << "Fixed: " << dl << " " << d2 << endl;

cout<< endl;

//

// Вывод булевых значений как "true/false".

//

bool b = true;

cout.setf(ios::boolalpha) ;

cout << "Boolean values: " << b << '' << !b endl;

return 0;

}

Рис. 2 Демонстрация флагов форматиоования потока

Состояние потока

Состояние объекта класса ios (и производных от него) содержится в его закрытом элементе _state в виде набора битов. Следующая таблица перечисляет имеющиеся биты состояния потока.

Таблица 4. Биты состояния потока

Бит

Описание

goodbit

С потоком все в порядке (на самом деле это не какой-то бит, а 0 — отсутствие битов ошибки).

eofbit

Показывает, что достигнут конец файла.

failbit

Индицирует ошибку формата или преобразования. После очистки данного бита работа с потоком может быть продолжена.

badbit

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

Для опроса или изменения состояния потока в классе ios имеется ряд функций и операций.

  • int rdstate() ; Возвращает текущее состояние.

  • bool eof() ; Возвращает true, если установлен eofbit.

  • bool good () ; Возвращает true, если не установлен ни один из битов ошибки.

  • bool fail () ; Возвращает true, если установлен failbit или bad-bit.

  • bool bad() ; Возвращает true, если установлен badbit.

  • void clear (int =0); Сбрасывает биты ошибки (по умолчанию) или устанавливает состояние потока в соответствии с аргументом.

  • void setstate(int) ; Устанавливает состояние битов ошибки с соответствии с аргументом.

  • operator void*() ; Возвращает нулевой указатель, если установлен какой-либо из битов ошибки.

  • bool operator! () ; Возвращает true, если установлен какой-либо из битов ошибки.

Примечание

Функция operator void*() неявно вызывается, если поток сравнивается с нулем (как cin в примере из листинга),