Глава 13. Обзор потоков ввода-вывода___________________________375
Поскольку флаги определены в классе ios, они используются с указанием имени класса и операцией разрешения области видимости (::). Флаг showbase добавляет к выводимому числу ' Ох', флаг hex преобразует десятичное 15 в шестнадцатеричный вид (f), a uppercase переводит его в верхний регистр; в результате будет напечатано число OXF.
Следующий фрагмент иллюстрирует применение команды width и флага right. При установке ширины 80 и выравнивании вправо, мы получим текст "Здравствуй, мир!" напечатанным с правого края текстового экрана шириной 80 символов.
cout.width(80);
.cout.setf( ios:: right);
cout « "Здравствуй, мир!";
Последний фрагмент изменяет ширину на 40, так что текст выводится ближе к центру 80-столбцового экрана:
cout.width(40) ;
cout.setf(ios::right) ;
cout « "Выравнивание по ширине" « endl;
В обоих примерах последний символ строки будет выведен в позиции, указанной параметром width.
Эти примеры дают вам общее понятие об использовании флагов формата. Чтобы у вас сформировалось о них полное представление, вам нужно знать, какие средства вам доступны, и попробовать все самому. В следующем разделе демонстрируется техника создания собственных манипуляторов потока.
Написание манипуляторов потока
Вы можете сами создавать функции, которые вставляются в потоки наподобие звеньев цепи. Так работают манипуляторы типа hex и endl. Это не переменные. Обозначение endl — это совершенно не то же самое, что '\п', однако манипулятор endl помимо прочего посылает в поток символ '\п'. Назначение манипуляторов потока состоит в том, чтобы обеспечить реализацию богатых возможностей ввода-вывода в стройной и аккуратной форме.
Встроенные манипуляторы потока
В C++ существует несколько предопределенных манипуляторов потока, например, endl. Встроенные манипуляторы исключительно просты в обращении. В этом разделе мы дадим вам общее представление о реализации встроенных манипуляторов, для того чтобы было понятнее, как создавать свои собственные.