Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ввод-вывод.doc
Скачиваний:
8
Добавлен:
18.04.2015
Размер:
273.92 Кб
Скачать

Иерархия потоковых классов (одна ветвь)

ios

ostream

istream

iostream

constream

istrstream

strstream

ostrstream

ifstream

fstream

ofstream

Это направленный граф, где стрелочка изображает – « производный от».

Производные классы всегда ниже базовых,

ios - прямой базовый для классов istream и ostream и опосредовано базовый для всех остальных классов. Схема упрощена, параллельная ветвь от второго базового класса вообще не показана на схеме, рассмотрим эту ветвь ниже.

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

iostream.h - классы ios , istream , ostream , iostream.

strstrea.h - классы istrstream , ostrstream, strstream

fstream.h - классы ifstream , ofstream , fstream

constrea.h - класс constream.

Т. к. класс ios является базовым для остальных, то включение в программу любого из заголовочных файлов автоматически подключает iostream.h .

Стандартные потоки ввода – вывода

Итак, файл iostream.h содержит описание соответствующих классов и содержит определение объектов класса - стандартных потоков ввода – вывода:

cin - объект класса istream , связанный со стандартным буферизированным входным потоком (клавиатура)

cout - объект класса ostream, связанный со стандартным буферизированным выходным потоком (обычно экран дисплея)

cerr - объект ostream класса, связанный со стандартным небуферизированным выходным потоком (обычно экраном дисплея), в который направляются сообщения об ошибках

clog - объект ostream класса, связанный со стандартным буферизированным выходным потоком (обычно экраном дисплея), в который направляются сообщения об ошибках.

При включении в программу файла iostream.h автоматически создаются и доступны эти стандартные объекты – потоки, по умолчанию связанные с клавиатурой и с экраном дисплея. При желании можно разорвать эту связь и связать потоки с тем или иным файлом.

В том же файле для этих объектов (потоков) определены операции ввода и вывода данных, которыми являются перегруженные для данных потоковых классов сдвиговые операции >> и << :

Операция ввода >> называется извлечением (чтением) данных из потока.

Операция вывода << называется включением (записью) данных в поток.

Такую роль конструкции >> и << играют только, если слева от них находятся объекты соответствующих классов:

Например,

cin >> имя переменной базового типа

cout << выражение базового типа

cerr << выражение базового типа

clog << выражение базового типа

Рассмотрим процесс ввода-вывода данных подробнее.

Внешнее (визуальное) представление данных не похоже на те внутренние коды, которые используются для их хранения внутри ЭВМ.

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

Поток при вводе и при выводе – это последовательность байтов (двоичных кодов фиксированной длины).

При вводе по кодам из потока формируются двоичные представления вводимых данных. Например, два смежных байта из потока могут быть рассмотрены как внутреннее представление целого числа, или могут быть рассмотрены как коды двух символов, это зависит от типа вводимых данных (от типа переменной, стоящей справа в операторе ввода).

При вводе выполняется преобразование символов из потока (с клавиатуры) в двоичные коды внутреннего представления данных, при этом происходит автоматическое распознавание типов вводимых данных.

При выводе из оперативной памяти извлекается значение выражения и помещается в выходной поток cout (на экран). При этом происходит преобразование двоичных кодов типизированного значения выражения в последовательность символов алфавита, изображающих значение на внешнем устройстве. Интерпретация выводимого значения производится автоматически.

При выводе байты (коды) потока преобразуются в последовательность символов, выводимых на экран.

В языке Си необходимо с помощью средств форматирования указать правила преобразования и форму представления вводимой и выводимой информации.

В С++ имеется новый механизм автоматического распознавания типов вводимых и выводимых данных.

Операции ввода (>>) и вывода (<<) перегружены так , что при той же форме они выполняются по-разному в зависимости от типа правого операнда.

Операция вывода <<

Операция вывода должна уметь распознавать тип выводимых данных.

Операция вывода перегружена, она применима в той же форме к данным типа : char, unsigned shot, singed shot , unsigned int, singed int , unsigned long, singed long , float , double, long double, char* , void*.

Операция определена только для двух указателей, и этого достаточно т.к. все указатели, отличные от char* , автоматически приводятся к типу void*.

Операция ввода >>

Подобная ситуация и при вводе данных. Операция извлечения >> перегружена, т.е. с одинаковым обозначением существуют три по-разному выполнимые операции: