Скачиваний:
46
Добавлен:
15.09.2014
Размер:
877.06 Кб
Скачать

664 Глава 11

Функция operator отображает части телефонного номера в виде строк, поскольку эти части хранятся в формате строк (вспомните, что функция-элемент getline класса istream сохраняет в памяти нулевой символ после завершения ввода).

Перегруженные функции operator объявляются в классе PhoneNumber как дружественные функции. Перегруженные операции ввода-вывода долж­ны быть объявлены как дружественные, если им необходим доступ к каким-то элементам, помимо открытых. Друзья класса имеют доступ к закрытым элементам.

Замечание по технике программирования 11.3

Новые возможности ввода-вывода данных, тип которых определен пользователем, добавляются в С++ без модификации объявлений или элементов-данных закрытого типа в классе ostream и в классе istream. Это способствует расширяемости ^ наиболее привлекательной черте языка С++.

11.10. Связывание выходного потока с входным

Интерактивные приложения обычно включают класс istream для ввода и класс ostream для вывода. Когда на экране появляется приглашение на ввод, пользователь вводит соответствующие данные. Очевидно, что пригла­шение на ввод должно появляться до осуществления операции ввода. При буферизации выходных данных их вывод на экран осуществляется только когда буфер окажется полным, когда вывод явным образом сбрасываются программой или автоматически в конце программы. В языке С++ имеется функция-элемент tie для синхронизации (связывания) выполнения операций над потоками istream и ostream, которая гарантирует, что вывод появится раньше последующего ввода. Вызов

cin.tie(&cout);

связывает cout (класса ostream) и cin (класса istream). В действительности этот вызов является лишним, поскольку С++ автоматически выполняет эту опера­цию при создании стандартной пользовательской среды ввода-вывода. Пользо­вателю следует, однако, явным образом связывать другие пары потоков классов ostream и istream. Для того, чтобы развязать входной поток inputStream от выходного, используйте следующий вызов :

inputStream.tie(0) ;

Резюме

  • Каждая операция ввода-вывода осуществляется способом, чувствитель­ ным к типу данных.

  • В языке С++ производится ввод-вывод потоков байтов. Поток — это просто последовательность байтов.

Потоки ввода-вывода в С++ 665

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

  • Язык С++ предоставляет возможности для ввода-вывода как на «низ­ ком», так и на «высоком» уровнях. Ввод-вывод на низком уровне сво­ дится к тому, что некоторое число байтов данных просто следует пере­ слать от устройства в память или из памяти в устройство. Ввод-вывод на высоком уровне заключается в том, что байты группируются в такие значащие элементы данных, как, например, целые числа, числа с пла- ваюш(ей запятой, символы, строки, а также данные типов, определен­ ных пользователем.

  • Язык С++ предоставляет возможности для неформатированного и фор­ матированного ввода-вывода. Неформатированный ввод-вывод позволя­ ет осуществлять пересылку файлов с высокой скоростью, но он обра­ батывает только сырые данные, которыми сложно пользоваться. Форматированный ввод-вывод обрабатывает структурированные дан­ ные, но требует дополнительного времени на их обработку, что может быть недостатком при передаче больших объемов данных.

  • Большинство программ на С++ включает заголовочный файл <ios- tream.h>, который содержит основную информация, необходимую для всех операций ввода-вывода.

  • Заголовочный файл <iomanip.h> содержит информацию, полезную для обработки форматированного ввода-вывода при помощи параметризо­ ванных манипуляторов потока.

  • Заголовочный файл <fstream.h> содержит информацию, необходимую для проведения операций с файлами.

  • Заголовочный файл <strstream.h> содержит необходимую информацию для выполнения форматированного ввода-вывода в память.

  • Заголовочный файл <stdiostream.h> включает важные сведения для программ, использующих для выполнения операций ввода-вывода со­ четание стилей языков С и С++.

  • Класс istream поддерживает операции ввода потоков.

  • Класс ostream поддерживает операции вывода потоков.

  • Класс iostream поддерживает как операции ввода, так и операции вы­ вода потоков.

  • Классы istream и ostream являются производными классами прямого наследования базового класса ios.

  • Класс iostream является производным классом множественного насле­ дования классов istream и ostream.

  • Операция сдвига влево («) перегружена для обозначения вывода в поток и называется операцией поместить в поток.

  • Операция сдвига вправо (») перегружена для обозначения ввода по­ тока и называется операцией взять из потока.

  • Объект стандартного потока ввода cin класса istream привязан к стан­ дартному устройству ввода, обычно к клавиатуре.