Глава 13. Обзор потоков ввода-вывода___________________________377
Создание собственных манипуляторов потока
Манипулятор endl — это функция-член. Чтобы раздвинуть рамки возможностей форматирования, нет никакой надобности создавать новый или дочерний класс, так как функции манипуляторов потоков являются глобальными.
Давайте начнем с уже знакомого нам манипулятора hex. Этот манипулятор, как нам известно, представляет целочисленные значения в шестнадцатерич-ном виде, но не преобразует их в верхний регистр и не приставляет к ним спецификатор основания системы счисления. Мы можем быстро все это исправить — прямо сейчас. Создайте заголовочный файл (чтобы потом можно было включать его в любые модули) и определите в нем единственную встраиваемую (inline) функцию:
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++. Имея в своем распоряжении эти классы, вы можете легко создать для файла поток и осуществлять обмен с ним способом, аналогичным консольному вводу-выводу. Для профаммистов это в первую очередь означает то, что научившись работать с консольным вводом-выводом, вы приобретаете все необходимые знания и умения для выполнения файлового ввода-вывода.