- •Классы потоков
- •Листинг 2. Форматирование с помощью манипуляторов
- •Листинг 3. Форматирующие флаги потоков
- •Состояние потока
- •Файловые потоки
- •Листинг 4. Примеры открытия файловых потоков
- •Бесформатный ввод-вывод
- •Класс istream
- •Класс ostream
- •Ввод-вывод с произвольным доступом
- •Листинг 5. Произвольный доступ к файлу
- •Заключение
Листинг 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 в примере из листинга),