Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 15 Ввод_Вывод 2015.doc
Скачиваний:
15
Добавлен:
29.02.2016
Размер:
83.46 Кб
Скачать

Глава 15. Ввод-вывод

Потоки

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

Форматирование данных

  • Флаги форматирования

  • Функции форматирования

  • Манипуляторы ввода-вывода

Обмен информацией между программой и внешними устройствами осуществляется с помощью операций ввода–вывода. В языкеС++нет специальных операторов для ввода–вывода. Вместо этого просто имеется набор классов, поставляемых вместе с компилятором, которые и реализуютосновные операции ввода–вывода.

Библиотека классов обеспечивает эффективный ввод–вывод всех встроенных типов и простое, но, тем не менее, гибкое определение операций ввода–вывода для типов, разрабатываемых программистом.

Потоки

В основе системы ввода–вывода(сокращённо –в/ы) языка программированияС++лежит понятиепотока, при помощи которого выполняютсяоперации ввода–вывода.

Поток (stream) – это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея, дисковод). У всех создаваемых в программе потоков характер поведения одинаков, несмотря на различные внешние устройства, с которыми они связываются. Поэтому практически ко всем типам устройств можно применить одни и те же функции и операции ввода–вывода, так как программа на языке С++ только рассматривает поток байтов, при этом ей не надо знать, откуда эти байты поступают или куда передаются.

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

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

По направлению передачи данных различают:

  • потоки ввода (входные потоки) – из которых извлекаются (читаются) данные и передаются в программу;

  • потоки вывода (выходные потоки)в которые вставляются (записываются) данные из программы;

  • потоки ввода–вывода (двунаправленные потоки)допускающие чтение и запись данных.

По виду устройств, с которыми работает поток, потоки делятся на:

  • стандартныепотоки – предназначены для передачи данных от клавиатуры и на экран дисплея;

  • файловые потоки – предназначены для обмена информацией с файлами на внешних носителях данных (например, на диске);

  • строковые потоки – предназначены для работы с массивами символов в оперативной памяти.

Существует два типа потоков – текстовый и двоичный (бинарный).

  • Текстовый поток используется для ввода-вывода символов. При этом могут происходить некоторые преобразования. Например, при выводе символ новой строки (числовой код 10) может быть преобразован в последовательность символов – возврата каретки и перехода на новую строку (с кодами 13 и 10 соответственно). Поэтому может не быть взаимно-однозначного соответствия между тем, что посылается в поток, и тем, что в действительности записывается на внешнее устройство. При вводе выполняется обратное преобразование.

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

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

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

Включение в программу заголовочного файла <iostream> даёт ей возможность иметь доступ к классу ios, который содержит множество функций и переменных для управления основными операциями над потоками.