Форматирующие функции-члены
ФОРМАТИРОВАНИЕ ПОТОКА
Оператор извлечения из потока
Для ввода информации из потока используется оператор извлечения, которым является перегруженный оператор сдвига вправо >>. Левым операндом оператора >> является объект класса istream. Это позволяет строить цепочки инструкций извлечения из потока, выполняемых слева направо. Правым операндом может быть любой тип данных, для которого определен поток ввода.
По умолчанию оператор >> пропускает символы-заместители, затем считывает символы, соответствующие типу заданной переменной. Пропуск ведущих символов-заполнителей устанавливается специально для этого предназначенным флагом форматирования. Рассмотрим следующий пример:
int i ;
double d ;
cin >> i >> d ;
Последняя инструкция приводит к тому, что программа пропускает ведущие символы-заполнители и считывает целое число i. Затем она игнорирует любые символы-заполнители, следующие за целым числом, и считывает переменную с плавающей точкой d.
Для переменной типа char* (рассматриваемого как строка) оператор >> пропускает символызаполнители и сохраняет следующие за ними символы, пока не появится следующий символ-заполнитель. Затем в указанную переменную добавляется нуль-символ.
До сих пор мы использовали для вывода информации во всех примерах форматы, заданные в C++ по умолчанию. Для управления форматированием библиотека ввода-вывода предусматривает три вида средств: форматирующие функции, флаги и манипуляторы. Все эти средства являются членами класса basic_ios и потому доступны для всех потоков.
Рассмотрим вначале форматирующие функции-члены. Их всего три: width ( ), precision ( ) и fill ( ).
По умолчанию при выводе любого значения оно занимает столько позиций, сколько символов выводится. Функция width ( ) позволяет задать минимальную ширину поля для вывода значения. При вводе она задает максимальное число читаемых символов. Если выводимое значение имеет меньше символов, чем заданная ширина поля, то оно дополняется символами-заполнителями до заданной ширины (по умолчанию – пробелами). Однако если выводимое значение имеет больше символов, чем ширина отведенного ему поля, то поле будет расширено до нужного размера. Эта функция имеет следующие прототипы:
streamsize width ( streamsize wide ) ;
streamsize width ( ) const ;
Тип streamsize определен в заголовочном файле <iostream.h> как целочисленный. Функция с первым прототипом задает ширину поля wide, а возвращает предыдущее значение ширины поля. Функция со вторым прототипом возвращает текущее значение ширины поля. По умолчанию она равна нулю, то есть вывод не дополняется и не обрезается. В ряде компиляторов после выполнения каждой операция вывода значение ширины поля возвращается к значению, заданному по умолчанию.
Функция precision ( ) позволяет узнать или задать точность (число выводимых цифр после запятой), с которой выводятся числа с плавающей точкой. По умолчанию числа с плавающей точкой выводятся с точностью, равной шести цифрам. Функция имеет precision ( ) следующие прототипы:
streamsize precision ( streamsize prec ) ;
streamsize precision ( ) const ;
Функция с первым прототипом устанавливает точность равной ргес и возвращает предыдущую точность. Функция со вторым прототипом возвращает текущую точность.
Замечание. Если не установлен флаг scientific или fixed (оба эти флага рассматриваются далее), то precision ( ) задает общее число цифр.
Функция fill ( ) позволяет прочесть или установить символ-заполнитель. Она имеет следующие прототипы:
char_type fill ( char_type ch ) ;
char_type fill ( ) const ;
Функция с первым прототипом устанавливает ch в качестве текущего символа-заполнителя и возвращает предыдущий символ-заполнитель. Функция со вторым прототипом возвращает текущий символзаполнитель. По умолчанию в качестве символа-заполнителя используется пробел. Тип данных char_typeявляется параметром класса basic_ios и может обозначать набор "узких" или "широких" символов.
Рассмотрим пример программы, в котором используются форматирующие функции:
#include <iostream.h>
#include <math.h>