Форматирующие функции-члены

ФОРМАТИРОВАНИЕ ПОТОКА

Оператор извлечения из потока

Для ввода информации из потока используется оператор извлечения, которым является перегруженный оператор сдвига вправо >>. Левым операндом оператора >> является объект класса 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>