
- •618 Глава 10
- •620 Глава 10
- •Глава 10
- •624 Глава 10
- •626 Глава 10
- •630 Глава 11 План
- •11.3. Вывод потоков
- •11.4. Ввод потоков
- •11.7. Состояния формата потоков
- •11.10. Связывание выходного потока с входным
- •11.1. Введение
- •632 Глава 11
- •11.2. Потоки
- •11.2.1. Заголовочные файлы библиотеки iostream
- •11.2.2. Классы и объекты потоков ввода-вывода
- •634 Глава 11
- •11.3. Вывод потоков
- •11.3.1. Операция поместить в поток
- •636 _ Глава 11
- •47 Плюс 53 равняется 100
- •11.3.2. Сцепление операций поместить в поток и взять из потока
- •47 Плюс 53 равняется 100
- •638 _ Глава 11
- •11.3.3. Вывод переменных типа char *
- •11.3.4. Вывод символов с помощью функции-элемента put; сцепленные выводы
- •11.4. Ввод потоков
- •11.4.1. Операция взять из потока
- •640 _ Глава 11
- •7 Не равно 5
- •8 Равно 8
- •11.4.2. Функции-элементы get и getline
- •642 Глава 11
- •644 Глава 11
- •11.4.3. Другие функции-элементы класса istream (peek, putback, ignore)
- •11.4.4. Сохранение типов данных при вводе-выводе
- •11.5. Неформатированный ввод-вывод с использованием read, gcount и write
- •11.6. Манипуляторы потоков
- •646 _ Глава 11
- •11.6.1. Манипуляторы потоков dec, oct, hex и setbase, задающие основание чисел
- •11.6.2. Точность чисел с плавающей запятой (precision,
- •11.6.3. Ширина поля (setw, width)
- •648 Глава 11
- •650 Глава 11
- •11.6.4. Манипуляторы, определяемые пользователем
- •11.7. Состояния формата потоков
- •11.7.1. Флаги состояний формата
- •Глава 11
- •11.7.2. Нулевые младшие разряды и десятичные точки
- •11.7.3. Выравнивание (ios::left, ios::right, ios::internal)
- •654 Глава 11
- •11.7.4. Заполнение (fill, setfill)
- •10000 Напечатанное как целое с выравниванием right и left и как шестнадцатеричное с выравниванием internal Использование заполняющего символа по умолчанию (пробела)
- •656 Глава 11
- •11.7.5. Основание системы счисления (ios::dec, ios::oct, ios::hex,
- •11.7.6. Числа с плавающей запятой; экспоненциальный формат (ios::scientific, ios::fixed)
- •658 Глава 11
- •11.7.7. Управление выводом в нижнем и верхнем регистрах
- •11.7.8. Установка и сброс флагов формата (flags, setiosflags
- •11.8. Состояния ошибок потока
- •11.9. Ввод-вывод определенных пользователем типов данных
- •Глава 11
- •После cin.Clear():
- •664 Глава 11
- •11.10. Связывание выходного потока с входным
- •Глава 11
- •Глава 11
- •670 Глава 11
- •672 Глава 11
- •674 Глава 11
- •676 Глава 11
- •1) Неверно. Поток cin связан со стандартным устройством ввода компьютера, обычно с клавиатурой.
- •0) Верно.
- •678 Глава 11
- •680 Глава 11
- •684 Глава 12
- •12.2. Шаблоны функций
- •686 Глава 12
- •Глава 12
- •12.3. Перегрузка шаблонных функций
- •12.4. Шаблоны классов
- •Глава 12
- •692 Глава 12
- •694 Глава 12
- •12.5. Шаблоны классов и нетиповые параметры
- •12.6. Шаблоны и наследование
- •12.7. Шаблоны и друзья
- •696 Глава 12
- •12.8. Шаблоны и статические элементы
- •Глава 12
- •700 Глава 12
- •702 Глава 12
- •704 Глава 13 План
- •13.1. Введение
- •706 Глава 13
- •708 Глава 13
- •13.2. Когда должна использоваться обработка исключений
- •13.3. Другие методы обработки ошибок
- •710 Глава 13
- •13.5. Простой пример обработки исключений: деление на нуль
- •712 Глава 13
- •13.6. Блоки try
- •13.7. Генерация исключений
- •714 Глава 13
- •13.8. Перехват исключений
- •716 Глава 13
- •718 Глава 13
- •13.9. Повторная генерация исключений
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 привязан к стан дартному устройству ввода, обычно к клавиатуре.