13.5  Манипуляторы

Существует альтернативный способ форматированного ввода-вы­вода. Этот способ использует механизм перегружаемых функций под названием «манипуляторы». Использование манипуляторов упрощает кодирование форматированного ввода-вывода. Они могут быть встав­лены в цепочку вывода с помощью операций << и >>. Манипуляторы бывают параметризованными и непараметризованными.

Для исполь­зования параметризованных манипуляторов необходимо включить в исходную программу директиву:

#include <iomanip.h>

Например, для переустановки системы счисления можно исполь­зовать функции-манипуляторы: dec – десятичная система счисления, hex – шестнадцатеричная система счисления, oct – восьмеричная система счисления. Например, в предложении cout

int а = 256, b = 72;

cout << а << hex << а << oct << а << "n";

содержимое переменной а будет последовательно выдаваться сначала в десятичной системе счисления, потом в шестнадцатеричной и в заключение в восьмеричной системе счисления; dec, hex, oct – представляют функции-манипуляторы без параметров, поэ­тому для их использования файл iomanip.h не нужен.

Параметризованный манипулятор setw() получает в качестве аргумента величину int, определяющую ширину выводимого поля. Для его использования необходимо включить директиву #include <iomanip.h.>.

Пример

#include <iostream.h>

#include <ioinanip.h>

int main()

{

int i = 256;                                                             

cout << setw(l0) << hex << i << setw(3) << dec << i << "n";

return 0;

}

В результате выполнения фрагмента программы получим:

ff       

Используя функции-манипуляторы, можно изменить точность плавающих чисел:

#include <iostream.h>

#inc1ude <iomanip.h>

int main()

{

cout << setprecision(10) << "Сейчас точность: " <<

cout.precision() << "    " << 10.89999999999999 << "n";

return 0;

}

После выполнения этой программы на экран будет выдано

Сейчас точность: 10    10.8999999999

Манипулятор setprecision(int) установил точность плавающего числа на 10.

Функции-манипуляторы представлены в табл. 13.2.

Таблица 13.2 Функции-манипуляторы

Имя

Действие

Примечание

dec

Устанавливает десятичную си­стему счисления

Используется для ввода-вывода

hex

Устанавливает шестнадцатеричную систему счисления

Используется для ввода-вывода

oct

Устанавливает восьмеричную систему счисления

Используется для ввода-вывода

ws

Позволяет ввести пробельные символы

Используется только для ввода

endl

Вставляет символ новой стро­ки и выгружает поток

Используется только для вывода

ends

Вставляет завершающий ну­левой символ строки

Используется только для вывода

flush

Выгружает поток ostream

Используется для вывода

setbase(int)

Устанавливает систему счис­ления в 0, 8, 10 или 16

Используется для вывода. 0 – значение по умолчанию. Озна­чает десятичную систему для вывода и использование пра­вил С для целых литералов

resetiosflags

(long)

Очищает биты формата во вводном и выводном потоке числом, заданным аргументом

Используется для ввода-вывода

setiosflags

(long)

Устанавливает биты формата вводного и выводного потоков на число, заданное аргументом

Используется для ввода-вывода

setfill(int)

Устанавливает символ-запол­ни­тель

Используется для ввода-вывода

setprecision (int)

Устанавливает точность для плавающего типа

Используется для ввода-вывода

setw(int)

Устанавливает ширину поля в n

Используется для ввода-вывода

При использовании манипулятора ws можно ввести пробельный символ. Например:

char sp;

cin >> ws >> sp;

Любой введенный пробельный символ будет попадать в пере­менную sp.

Ввод-вывод в языке C++, если не применять специальные средства, буферизован. Это повышает эффективность выполнения програм­мы, но создает трудности при написании интерактивной програм­мы. Такие программы должны выполнять альтернативные дейст­вия в зависимости от введенного символа, несмотря на то, запол­нен буфер или нет. Для этого необходимо иметь функции, обеспе­чивающие выгрузку буфера в любой момент. Манипулятор flush как раз и выполняет такие действия:

cout << "Ввести имя: n" << flush;

Полезна также функция-манипулятор endl. Она вызывает пе­ревод на новую строку и выгрузку буфера. Две следующие строки практически эквивалентны:

cout << z << "n" << flush;

cout << z << endl;