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