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


Библиотека обеспечивает программиста механизмами для извлечения данных из потоков и для помещения данных в потоки [5,8-9]. Каждый поток (за исключением строковых) ассоциируется при помощи операционной системы с определенным внешним устройством. При обмене с потоком используется вспомогательный участок памяти, называемый буфером потока. При вводе данных они сначала помещаются в буфер и только затем передаются выполняемой программе. При выводе данные заполняют буфер перед передачей внешнему устройству. Заполнение и очистку буферов операционная система выполняет без явного участия программиста, поэтому поток в прикладной программе можно рассматривать как последовательность байтов, не зависящую от конкретных устройств, с которыми ведется обмен данными.

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

В зависимости от реализуемого направления передачи данных потоки делят на три группы [5,8-9]:

· входные, из которых читается информация;

· выходные, в которые вводятся данные;

· двунаправленные, допускающие как чтение, так и запись.

В соответствии с особенностями обслуживаемого устройства потоки принято делить на следующие группы:

· стандартные, для передачи данных от клавиатуры к дисплею (во всех предыдущих программах использовались потоки данной группы);

· файловые, при размещении данных на внешнем носителе (например, диск, магнитная лента);

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

13.2. Классы потоков C++

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

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

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

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

Тем не менее, для прикладного программиста обычно достаточно лишь сведений об основных классах, показанных на рисунке 8.

 

 

Рисунок 8 – Иерархия потоков ввода-вывода

 

Перечислим основные классы потоков ввода-вывода:

· ios — базовый потоковый класс;

· strstreambase — базовый класс строковых потоков;

· fstreambase — базовый класс файловых потоков;

· istream — класс входных потоков;

· ostream — класс выходных потоков;

· iostream — класс двунаправленных потоков ввода-вывода;

· ifstream — класс входных файловых потоков;

· ofstream — класс выходных файловых потоков;

· fstream — класс двунаправленных файловых потоков;

· istrstream — класс входных строковых потоков;

· ostrstream — класс выходных строковых потоков;

· strstream — класс двунаправленных строковых потоков.

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

Буферизация данных потоков реализована при помощи следующего механизма: класс ios, а следовательно, и производные классы содержат указатель на объект класса streambuf библиотеки базового класса, обеспечивающего свои производные классы общими методами для буферизации данных. В свою очередь его производные классы (filebuf и strstreambuf) обеспечивают взаимодействие создаваемых потоков с физическими устройствами. Данная параллельная иерархическая структура классов-буферов не показана на рисунке 8 по причине достаточно редкой необходимости обращения к методам и данным класса streambuf напрямую из прикладных программ. Вместо этого чаще происходит опосредованное их использование вызовом методов классов-наследников ios.

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

· iostream.h —для классов ios, istream, ostream, stream;

· fstream.h —для классов fstreambase, ifstream, ofstream, fstream;

· strstrem.h — для классов strstreambase, istrstream, ostrstream, strstream.

Поскольку класс ios является базовым для остальных потоковых классов, то включение в текст программы любого из заголовочных файлов fstream.h или strstrem.h автоматически подключает к программе и файл iostream.h. Соответствующие проверки выполняются на этапе препроцессорной обработки.



Дата добавления: 2021-07-22; просмотров: 368;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.