Глава 13. Обзор потоков ввода-вывода___________________________377

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

Манипулятор endl — это функция-член. Чтобы раздвинуть рамки возможностей форматирования, нет никакой надобности создавать новый или дочерний класс, так как функции манипуляторов потоков являются глобальными.

Давайте начнем с уже знакомого нам манипулятора hex. Этот манипулятор, как нам известно, представляет целочисленные значения в шестнадцатерич-ном виде, но не преобразует их в верхний регистр и не приставляет к ним спецификатор основания системы счисления. Мы можем быстро все это исправить — прямо сейчас. Создайте заголовочный файл (чтобы потом можно было включать его в любые модули) и определите в нем единственную встраиваемую (inline) функцию:

h03171.jpg

1 // UPPERHEX.H — Содержит встраиваемый манипулятор потока

2 #ifndef _UPPERHEX_H

3 ftdefine _UPPERHEX_H

4 #include <iostream.h>

5 ostreams upperhex(ostream& os)

6 {

7 os.setff ios::hex I ios::uppercase I ios::showbase) ;

8 return os;

9 . }

10: ttendif

Вся работа выполняется в строке 7: вызывается функция setf, ей передаются аргументы, обеспечивающие требуемый результат. Эта функция вызывается в операции вывода

cout « uppercase «35;

в результате чего на дисплей будет выведено

0х23

Файловые потоки

Классы файловых потоков — это едва ли не лучшее, что есть в C++. Имея в своем распоряжении эти классы, вы можете легко создать для файла поток и осуществлять обмен с ним способом, аналогичным консольному вводу-выводу. Для профаммистов это в первую очередь означает то, что научившись работать с консольным вводом-выводом, вы приобретаете все необходимые знания и умения для выполнения файлового ввода-вывода.