Выбрать главу

При использовании манипуляторов, которые принимают аргументы, необходимо включить в программу заголовок <iomanip>.

Манипулятор используется как часть выражения ввода-вывода. Вот пример программы, в которой показано, как с помощью манипуляторов можно управлять форматированием выводимых данных.

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

 cout << setprecision (2) << 1000.243 << endl;

 cout << setw(20) << "Всем привет! ";

 return 0;

}

Результаты выполнения этой программы таковы.

1е+003

Всем привет!

Обратите внимание на то, как используются манипуляторы в цепочке операций ввода-вывода. Кроме того, отметьте, что, если манипулятор вызывается без аргументов (как, например, манипулятор endl в нашей программе), то его имя указывается без пары круглых скобок.

В следующей программе используется манипулятор setiosflags() для установки флагов scientific и showpos.

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

 cout << setiosflags(ios::showpos);

 cout << setiosflags(ios::scientific);

 cout << 123 << " " << 123.23;

 return 0;

}

Вот результаты выполнения данной программы.

+123 +1.232300е+002

А в этой программе демонстрируется использование манипулятора ws, который пропускает ведущие "пробельные" символы при вводе строки в массив s:

#include <iostream>

using namespace std;

int main()

{

 char s[80];

 cin >> ws >> s;

 cout << s;

 return 0;

}

Создание собственных манипуляторных функций

Программист может создавать собственные манипуляторные функции. Существует два типа манипуляторных функций: принимающие и не принимающие аргументы. Для создания параметризованных манипуляторов используются методы, рассмотрение которых выходит за рамки этой книги. Однако создание манипуляторов, которые не имеют параметров, не вызывает особых трудностей.

Все манипуляторные функции вывода данных без параметров имеют следующую структуру.

ostream &manip_name(ostream &stream)

{

 // код манипуляторной функции

 return stream;

}

Здесь элемент manip_name означает имя манипулятора. Важно понимать, что, несмотря на то, что манипулятор принимает в качестве единственного аргумента указатель на поток, который он обрабатывает, при использовании манипулятора в результирующем выражении ввода-вывода аргументы не указываются вообще.

В следующей программе создается манипулятор setup(), который устанавливает флаг выравнивания по левому краю, ширину поля равной 10 и задает в качестве заполняющего символа знак доллара.

#include <iostream>

#include <iomanip>

using namespace std;

ostream &setup(ostream &stream)

{

 stream.setf(ios::left);

 stream << setw(10) << setfill ('$');

 return stream;

}

int main()

{

 cout << 10 << " " << setup << 10;

 return 0;

}

Собственные манипуляторы полезны по двум причинам. Во-первых, иногда возникает необходимость выполнять операции ввода-вывода с использованием устройства, к которому ни один из встроенных манипуляторов не применяется (например, плоттер). В этом случае создание собственных манипуляторов сделает вывод данных на это устройство более удобным. Во-вторых, может оказаться, что у вас в программе некоторая последовательность инструкций повторяется несколько раз. И тогда вы можете объединить эти операции в один манипулятор, как показано в предыдущей программе.