    Потоковые классы выполняют форматированный ввод-вывод со встроенной 
поддержкой обработки ошибок. Потоки ввода-вывода поддерживают базовые типы 
данных, подобные char, short, int, long, char* (напри мер,  символьная строка,  
завершающаяся нулем),  float, double,  long double и void* (отображается как 
значение-адрес). 
    Имейте в виду, что cin, cout, cerr и clog — объекты классов. В соответствующих 
им классах определены перегруженные операторы потоков ввода и вывода, что 
позволяет использовать операторы ввода-вывода в поток следующим образом: 

    cin » v;        // Прочитать v из стандартного ввода	
    cout « v;      // Записать v в стандартный вывод                  

    Как вы увидите в других примерах, операторы ввода-вывода можно 
использовать каскадом, как в следующем выражении: 

    cout « "Balance == $" « balance < " (dollars)\n";	

    Для форматирования вывода вы можете установить один или несколько флагов в 
объекте потока ввода-вывода (см. объявление класса ios в заголовочном файле 
IOSTREAM.H). Следует использовать функции-члены flags(),  setf() и unsetfO для 
управления состоянием этих флагов. Например, для вывода беззнакового
значения в шестнадпатеричной форме следует установить флаг hex в cout 
путем следующего обращения к функции-члену setfO класса ios: 

    unsigned v = 12345;	
    cout « "Before:  " « v « '\n';	// Вывод по умолчанию (десятичный)     
    cout.setf(cout.hex);	// Модификация потока вывода              
    cout « "After:    " « v « '\n'	// Шестнадцатеричный вывод         

    Несмотря на то что это сработает, как показано дальше, существуют более 
простые способы форматирования потока вывода. 

    Использование манипуляторов 

    Подключение заголовочного файла IOMANIP.H (в котором при необходимости 
включается заголовочный файл IOSTREAM.H) делает возможным использование 
нескольких манипуляторов, полезных для создания форматированного вывода и 
чтения форматированного ввода. Например, вы можете использовать манипулятор 
hex для вывода значения в шестнадцатеричной форме: 

    unsigned v = 12345; 
    cout « "In hexadecimal v == " « hex « v « '\n'; 
    cout « "In decimal v == " « dec « v « '\n'; 

    В последней строке используется манипулятор dec для возвращения cout в 
состояние форматированного вывода в десятичной форме. Вы также можете 
манипулировать потоками ввода. Следующие операторы читают шестнадпатеричное 
значение и выводят его же в десятичной форме: 

    cout « "Enter value in hex: "; 
    cin » hex » v;	
    cout « "Value in decimal == " « dec « v;	

    В табл. 15.2 перечислены манипуляторы ввода-вывода, определенные в 
заголовочных файлах IOMANIP.H и IOSTREAM.H. 
    Некоторые манипуляторы используются с параметрами. Например, манипулятор 
setbase(int n) форматирует значение в системе счисления с основанием п. (Если 
n — нуль, вывод по умолчанию становится десятичным, а ввод по умолчанию 
соответствует спецификациям ANSI С для символьного представления целочисленных 
значений.)	

    Таблица 15.2. Манипуляторы потоков ввода-вывода	

    Манипулятор	Действие 

    dec	Преобразовать в десятичную систему счисления 
    endl	Начать новую строку; вывести буфер потока 
    ends	Вставить нулевой завершающий символ в строку 
    flush	Выполнить довывод в поток 
    hex	Преобразовать в шестнадцатеричную систему счисления 
    lock(ios &r)	Заблокировать дескриптор файла для ссылки ir на поток ввода-вывода 


    386     Часть III. Программирование на ANSI C++ 
