Программирование >>  Операторы преобразования типа 

1 ... 178 179 180 [ 181 ] 182 183 184 ... 239


Оба класса представляют собой специализапии шаблонов 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

Манипулятор

Класс

Описание

endl

ostream

Вывод \п и очистка выходного буфера

ends

ostream

Вывод \0

flush

ostream

Очистка выходного буфера

istream

Чтение с игнорированием пропусков



Простой пример

Следующий пример демонстрирует работу с потоковыми классами. Программа читает два вещественных числа и выводит их произведение.

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.



1 ... 178 179 180 [ 181 ] 182 183 184 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика