|
Программирование >> Операторы преобразования типа
Оба класса представляют собой специализапии шаблонов basicjstreamo и basic ostream<> для типа символов char. Библиотека lOStream не зависит от конкретного типа символов - для большинства классов библиотеки этот тип передается в аргументе шаблона. Параметризация по типу символов является аналогом параметризации строковых классов и используется при интернационализации программ (см. главу 14). Здесь мы ограничимся рассмотрением ввода и вывода в узких потоках данных, то есть в потоках данных с типом символов char. Потоки данных с другими типами символов будут рассмотрены во второй половине главы. Глобальные потоковые объекты в библиотеке lOStream определено несколько глобальных объектов типов istream и ostream. Эти объекты соответствуют стандартным каналам ввода-вывода. О Объект cin (класс istream) представляет стандартный входной каиа.?:, используемый для ввода пользовательских данных. Он соответствует потоку данных stdin в языке С. Обычно операционная система связывает этот канал с клавиатурой. О Объект cout (класс ostream) представляет стандартный выходной канал, предназначенный для вывода результатов работы программы. Он соответствует потоку данных stdout в языке С. Обычно операционная система связывает этот канал с монитором. О Объект cerr (класс ostream) представляет стандартный канал, предназначенный для вывода всевозможных сообщений об ошибках. Он соответствует потоку данных stderr в языке С. Обычно операционная система также связывает этот канал с монитором. По умолчанию вывод в cerr не буферизуется. О Объект clog (класс ostream) представляет стандартный канал для регистрации данных и не имеет аналогов в языке С. По умолчанию этот поток данных связывается с тем же приемником, что и cerr, но вывод в clog буферизуется. Отделение нормального вывода от сообщений об ошибках позволяет по-разному обойтись с этими двумя категориями потоков данных при выполнении программы. Например, нормальный вывод программы можно перенаправить в файл, тогда как сообщения об ошибках будут выводиться на консоль. Конечно, для этого операционная система должна поддерживать перенаправление стандартных каналов ввода-вывода (впрочем, в большинстве операционных систем такая возможность существует). Разделение стандартных каналов берет свое начало в механизме перенаправления ввода-вывода системы UNIX. Потоковые операторы Операторы сдвига >> и << были перегружены для потоковых классов и означают соответственно ввод и вывод. При помощи этих операторов можно выполнять каскадные операции ввода-вывода. Например, следующий цикл при каждой итерации читает из стандартного входного потока данных два целых числа (пока вводятся только целые числа) и записывает их в стандартный выходной поток данных: int а. Ь; Пока операции ввода а и b проходят успешно while (std::c1n а b { Вывод а и b std::cout а: а Ь: b std::endl: Манипуляторы в конце больщинства команд потокового ввода-вывода записывается так называемый манипулятор: std::COUt std::endl Манипуляторы - специальные объекты, предназначенные для управления потоком данных. Часто манипуляторы изменяют только режим интерпретации ввода или форматирования вывода (например, манипуляторы выбора системы счисления dec, hex и oct). Это означает, что манипуляторы потока данных ostream не всегда создают выходные данные, а манипуляторы потока данных istream не всегда интерпретируют ввод. Однако некоторые манипуляторы выполняют непосредственные действия - очистку выходного буфера, переключение в режим игнорирования пропусков при вводе и т. д. Манипулятор endl обозначает конец строки , а при его выводе выполняются две операции. 1. Отправка признака новой строки (то есть символа \п) в выходной поток данных. 2. Очистка выходного буфера (принудительный вывод всех буферизованных данных методом flush()). Наиболее важные манипуляторы библиотеки lOStream перечислены в табл. 13.1. Более подробное описание манипуляторов (в том числе и определенных в библиотеке lOStream) приведено на с. 586. Также там рассказано, как определить пользовательский манипулятор. Таблица 13.1. Важнейшие манипуляторы библиотеки lOStream
Простой пример Следующий пример демонстрирует работу с потоковыми классами. Программа читает два вещественных числа и выводит их произведение. 1o/iol.cpp #1nclude <cstdl1b> #include <lostredm> using namespace std; int ma1n() { double X. y; Операнды Вывод заголовка cout Multiplication of two floating point values endl; Чтение первого операнда cout first operand; ; If (! (cin X)) { /* Ошибка ввода * => вывести сообщение и завершить программу с кодом ошибки */ cerr error while reading the first floating value endl: return EXITJAILURE; Чтение второго операнда cout second operand: ; if (! (cin y)) { /* Ошибка ввода * => вывести сообщение и завершить программу с кодом ошибки */ cerr error while reading the second floating value endl; return EXITJAILURE: Вывод операндов и результата cout X times у equals x * у endl; Основные потоковые классы и объекты Иерархия потоковых классов Потоковые классы библиотеки lOStream образуют иерархию, изображенную на рис. 13.1. Для шаблонных классов в верхней строке указано имя шаблона, а в нижней - имена специализаций для типов char и wchar t.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |