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

1 ... 180 181 182 [ 183 ] 184 185 186 ... 239


typedef basic istream<char> iostream: typedef bas1c 1stream<wchar t> wiostream:

В западном полушарии обычно исиользуются типы istream и ostream, в целом совместимые со старыми потоковыми классами AT&T.

Классы istream withassign, ostream withassign и iostream withassign, включенные в некоторые старые потоковые библиотеки (и производные от istream, ostream и iostream соответственно), не поддерживаются стандартом. Их функциональность реализуется другими средствами (см. с. 615).

Также в библиотеку lOStream входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками. Эти классы рассматриваются на с. 602 и 619.

Глобальные потоковые объекты

Для потоковых классов определен ряд глобальных потоковых объектов, предназначенных для работы со стандартными каналами ввода-вывода (табл. 13.2). Эти объекты упоминались выше при описании потоков данных с типом символов char, однако аналогичные объекты также определены для потоков данных с типом символов wchar t.

Таблица 13.2. Глобальные потоковые объекты

Назначение

istream

Читает данные из стандартного канала ввода

ostream

cout

Записывает нормальные данные в стандартный канал вывода

ostream

cerr

Записывает сообщения об ошибках в стандартный канал вывода ошибок

ostream

clog

Записывает журнальные данные в стандартный канал вывода журнала

wistream

wcin

Читает данные с расширенной кодировкой символов из стандартного канала ввода

wostream

wcout

Записывает нормальные данные с расширенной кодировкой символов в стандартный канал вывода

wostream

wcerr

Записывает сообщения об ошибках с расширенной кодировкой символов в стандартный канал вывода ошибок

wostream

wclog

Записывает журнальные данные с расширенной кодировкой символов в стандартный канал вывода журнала

По умолчанию эти стандартные потоки данных синхронизируются со стандартными потоками данных С. Иначе говоря, стандартная библиотека С++ гарантирует сохранение порядка вывода при смешанном использовании потоков данных С и С++. Перед выводом все буферы стандартных потоков данных С++ очищают буферы соответствующих потоков данных С, и наоборот. Разумеется, синхронизация требует дополнительного времени. Если она не нужна, отключите ее вызовом sync with stdio(false) перед первой операцией ввода-вывода (см. с. 654).



тандартные операторы << и >>

В С и С++ операторы << и >> используются для сдвига битов целых чисел вправо и влево. Классы basicjstream и basic ostream перегружают операторы >> и << для выполнения стандартных операций ввода-вывода.

На первый взгляд кажется, что объявлять классы с поддержкой ввода и вывода в заголовке <istreain> нелогично. Но так как в начале работы каждой единицы трансляции, включающей <iostream>, тратится время на инициализацию, объявления для ввода и вывода были выделены в файл <istream>.

(аголовочные файлы

Определения потоковых классов распределены по нескольким заголовочным файлам.

О <iosfwd>. Содержит опережающие объявления потоковых классов. Этот заголовочный файл необходим из-за того, что простые опережающие объявления вида class ostream теперь не разрешены.

О <streambuf>. Содержит определения базового потокового класса с буферизацией (basic streambuf<>).

О <istream>. Содержит определения классов, поддерживающих только ввод (ba5ic istreamo), а также классов с поддержкой ввода и вывода (basicjostreamo)

О <ostream>. Содержит определения потокового luiacca вьшода (basic ostream<>).

О <iostream>. Содержит объявления глобальных потоковых объектов (таких, как cin и cout).

Многие из этих заголовочных файлов предназначены для внутренней организации стандартной библиотеки С++. Прикладному программисту обычно достаточно включить файл <iosfwd> в объявление потоковых классов и <istream> или <ostream> при непосредственном использовании функций ввода или вывода. Заголовок <iostream> следует включать только при использовании стандартных потоковых объектов. В некоторых реализациях в начале работы каждой единицы трансляции, включающей этот заголовок, вьшолняется фрагмент кода инициализации. Само по себе выполнение этого кода обходится недорого, но при этом приходится загружать соответствующие страницы исполняемого файла, а эта операция может быть довольно дорогостоящей. Как правило, в программу следует включать только заголовки, содержащие абсолютно необходимые объявления. В частности, в заголовочные файлы должен включаться только заголовок <iosfwd>, а соответствующие файлы реализации включают заголовок с полным определением.

Специальные средства работы с потоками данных (параметризованные манипуляторы, файловые и строковые потоки данных) определяются в дополни тельных заголовочных файлах (<iomanip>, <fstream>, <sstream> и <str5tream>). Дополнительная информация об этих заголовках приводится в разделах, посвященных этим специальным средствам.



Оператор вывода <<

Класс basic ostream (а следовательно, и классы ostream и wstream) интерпретирует << как оператор вывода. Он перегружает этот оператор для всех базовых типов, включая char*, void и bool.

В соответствии с определением операторов потокового вывода второй аргумент передается в соответствующий поток данных. Иначе говоря, данные пересылаются в направлении стрелки :

int 1 = 7;

Std: icout 1: Вывод: 7

float f = 4.5:

std::cout f; Вывод: 4.5

Оператор << перегружается так, что второй аргумент может относиться к произвольному тину данных. Это позволяет интегрировать ваши типы данных с системой ввода-вывода. Компилятор следит за тем, чтобы для вывода второго аргумента была вызвана правильная функция. Конечно, эта функция должна преобразовать второй аргумент в последовательность символов, выводимых в поток данных.

В стандартной библиотеке С++ этот механизм также применяется при выводе строк (см. с. 506), битовых полей (см. с. 452) и комплексных чисел (см. с. 518):

std: :strlng sChello ): s +- . world ;

std::cout s: Вывод: hello, world

std::b1tset<lO> flegs(7):

std::cout flags; Вывод: 0000000111

std::complex<float> c(3.1.7.4);

Std:;COut c; Вывод: (3.1.7.4)

Принципы определения операторов вывода для пользовательских типов данных рассматриваются на с. 625.

Возможность расширения механизма вывода для поддержки пользовательских типов данных является сушественным усовершенствованием по сравнению с механизмом ввода-вьшода языка С, основанным па использовании функции printf(), поскольку больше не требуется указание типа выводимого объекта. Перегрузка оператора для различных типов гарантирует, что правильная функция вывода будет выбрана автоматически. Оператор << не ограничивается стандартными типами. Таким образом, в распоряжении программиста появляется единый механизм вывода, работающий со всеми типами.

Оператор << также может использоваться для вывода нескольких объектов в одной команде. По общепринятым правилам операторы вывода возвращают свой первый аргумент, то есть результатом выполнения оператора вывода явля-



1 ... 180 181 182 [ 183 ] 184 185 186 ... 239

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