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

20 istreams operator»( istreams is, DATES date)

21 { •

22 return is » date.day » date.month » date.year;

23 }

24 #ifdef DATEJ3CAFFOLD

25 void main()

26 {

27 DATE d;

28 cout « d « endl;

29 cout « "Введите день, месяц, год (через пробел)" « endl;

30 . cin » d;

31 cout « "Новая дата: " « d « endl;

32 }

33 #endif

В строках с 13 по 19 определяется функция operator« (операция потока ostream), а в строках с 20 по 23 — операция потока istream. Операция потока вывода, по нашему замыслу, должна печатать форматированную дату. Какой сюрприз! Мы видим функцию sprintf, похожую на printf из С, с той только разницей, что эта функция записывает не на устройство вывода, а в символьный буфер. Переменная dateStr объявлена как статическая, поскольку она определена внутри функции, но использоваться будет и за пределами локальной области видимости. Функция, продолжая цепочку потока, возвращает переданный ей объект ostreams, но уже несущий отформатированную дату.

Операция потока istream считывает каждый элемент данных в объект-аргумент. Неплохо бы добавить в него также приглашение на ввод данных и какую-нибудь обработку ошибок. Для реального класса календарных дат класс DATE далеко не завершен; цель была другая — продемонстрировать общие принципы разработки ввода-вывода с помощью классов. Интерфейс этих двух оператор-функций потоков от класса к классу будет изменяться очень незначительно.

В строках 24—33 содержится маленькая тестовая программа. Подобные программы для тестирования классов вы можете вставлять в свои модули. В ней определяется объект, по умолчанию уже имеющий некоторое значение (строка 27), делается вывод на консоль, затем печатается запрос на ввод новой даты. Заметьте, насколько прост синтаксис использования класса

DATE.

'Напоследок маленький подарок. Вспомните предыдущие разделы — синтаксис чтения и записи был один и тот же для самых различных устройств. Потоки ввода и вывода относятся к тому же семейству классов, что и файловые и консольные потоки; поэтому вариации устройств не влияют на синтаксис обмена с ними. То есть

DATE d;

cout « d; // Вывод даты на консоль