Шаг 1.
Общие сведения о библиотеке потокового ввода-вывода

    На этом шаге мы приведем общие сведения о библиотеке потокового ввода-вывода.

    Под "программированием на языке С++" обычно понимается "программирование в среде С++". Дело в том, что никакая полезная программа не может быть написана на языке С++ без привлечения библиотек, включаемых в конкретную среду (в компилятор) языка. Конкретная среда С++, в которой разрабатывается программа, обычно обеспечивает программиста удобными средствами для работы с ее библиотеками. При этом по утверждению Б.Страуструпа: "Для использования библиотеки совсем не нужно знание методов, которые применялись для ее реализации". Однако знание правил использования средств библиотеки совершенно необходимо. Самая незаменимая из этих библиотек - библиотека ввода-вывода, так как средства ввода-вывода непосредственно в язык С++ (также как и в язык С) не входят. В программах на языке С++ можно равноправно использовать две библиотеки ввода-вывода: стандартную библиотеку функций языка С (стандарт ANSI С) и библиотеку классов, специально созданную для языка С++. Библиотека функций языка С становится доступной в программе, как только в ее заголовок будет включен файл stdio.h. Для обращения к функциям требуются сведения об их прототипах и соблюдение соглашений стандарта. Подробную информацию можно получить из технической документации того компилятора, с которым вы работаете.

    На протяжении всех шагови в программах постоянно использовалась препроцессорная директива:

         #include <iostream.h>

    Назначение указанного в директиве заголовочного файла iostream.h - связать компилируемую программу с одной из основных частей библиотеки ввода-вывода, построенной на основе механизма классов. Эта библиотека ввода-вывода почти стандартна, так как включена практически во все компиляторы С++. Однако о стандарте библиотеки ввода-вывода С++ можно говорить только неформально. Библиотека создана позже, чем появился язык, она разрабатывалась в некотором смысле независимо от создания языка С++, не входит в формальное описание языка и написана на языке С++.

Потоки ввода-вывода

    В соответствии с названием заголовочного файла iostream.h (stream - поток; "i" - сокращение от input - ввод; "o" - сокращение от output - вывод) описанные в этом файле средства ввода-вывода обеспечивают программиста механизмами для извлечения данных из потоков и для включения (внесения) данных в потоки. Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от тех конкретных устройств (файл на диске, принтер, клавиатура, дисплей, стример и т.п.), с которыми ведется обмен данными. При обмене с потоком часто используется вспомогательный участок основной памяти - буфер потока (рисунок 1- буфер вывода, рисунок 2 - буфер ввода).


Рис.1. Буферизированный выходной поток

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

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


Рис.2. Буферизированный входной поток

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

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

    В соответствии с особенностями "устройства", к которому "присоединен" поток, потоки принято делить на

    Из перечисленных потоков мы не будем рассматривать только консольные потоки. Причин для этого несколько. Во-первых, консольные потоки отсутствовали в классических реализациях библиотеки потокового ввода-вывода. Во-вторых, консольные потоки несовместимы с операционной средой Microsoft Windows и могут использоваться только при разработке программ, работающих под управлением MS-DOS. Консольные потоки поддерживаются классом constream и обеспечивают удобный доступ к терминалу. В них есть возможности работы с клавиатурой и средства манипуляции с участками экрана и с экраном в целом.

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

    На следующем шаге мы приведем иерархию классов библиотеки ввода-вывода.




Содержание Следующий шаг