Система ввода/вывода С++ включает второй способ изменения параметров форматирования потока. Для этого используются специальные функции, называемые манипуляторами (manipulators), которые могут включаться в выражения ввода/вывода. Стандартные манипуляторы показаны в таблице.
Манипулятор | Назначение | Ввод/вывод |
---|---|---|
dec | Ввод/вывод данных в десятичной форме | ввод и вывод |
endl | Вывод символа новой строки с передачей в поток всех данных из буфера | вывод |
ends | Вывод нулевого символа | вывод |
flush | Передача в поток содержимого буфера | вывод |
hex | Ввод/вывод данных в шестнадцатиричной системе | ввод и вывод |
oct | Ввод/вывод данных в восьмеричной форме | ввод и вывод |
resetiosflags(long f) | Сбрасывает флаги, указанные в f | ввод и вывод |
setbase(int base) | Устанавливает базу счисления равной параметру base | вывод |
setfill(int ch) | Устанавливает символ заполнения равным ch | вывод |
setiosflags(long f) | Устанавливает флаги, указанные в f | ввод и вывод |
setprecision(int p) | Устанавливает число цифр после запятой | вывод |
setw(int w) | Устанавливает ширину поля равной w | вывод |
ws | Пропускает начальный символ-разделитель | ввод |
Для использования манипуляторов с параметрами в программу необходимо включить заголовочный файл iomanip.h.
Манипуляторы могут использоваться в составе выражений ввода/вывода. Ниже представлен пример программы, использующей манипуляторы для изменения формата вывода:
#include <iostream.h>
#include <iomanip.h>
int main()
{
cout << setiosflags(ios::fixed);
cout << setprecision (2) << 1000.243 << endl;
cout << setw (20) << "Hello there.";
return 0;
}
Программа выводит следующие данные:
1000 .24
Hello there.
Обратим внимание, как манипуляторы появляются в последовательности операторов ввода/вывода. Когда манипуляторы не имеют аргументов, как манипулятор endl в этой программе, за ними не следуют скобки. Причина этого в том, что оператору << передается адрес манипулятора.
Следующая программа использует функции setiosflags() для установки флагов scientific и showpos потока cout:
#include <iostream.h>
#include <iomanip.h>
main ()
{
cout << setiosflags(ios::showpos);
cout << setiosflags(ios::scientific);
cout << 123 << " " << 123.23;
return 0;
}
Следующая программа использует манипулятор ws для пропуска идущих вначале символов- разделителей при вводе строки в переменную s:
#include <iostream.h>
int main()
{
char s [80];
cin >> ws >> s;
cout << s;
}