Глава 15. Ввод-вывод
Потоки
Стандартные потоки ввода–вывода
Форматирование данных
Флаги форматирования
Функции форматирования
Манипуляторы ввода-вывода
Обмен информацией между программой и внешними устройствами осуществляется с помощью операций ввода–вывода. В языкеС++нет специальных операторов для ввода–вывода. Вместо этого просто имеется набор классов, поставляемых вместе с компилятором, которые и реализуютосновные операции ввода–вывода.
Библиотека классов обеспечивает эффективный ввод–вывод всех встроенных типов и простое, но, тем не менее, гибкое определение операций ввода–вывода для типов, разрабатываемых программистом.
Потоки
В основе системы ввода–вывода(сокращённо –в/ы) языка программированияС++лежит понятиепотока, при помощи которого выполняютсяоперации ввода–вывода.
Поток (stream) – это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея, дисковод). У всех создаваемых в программе потоков характер поведения одинаков, несмотря на различные внешние устройства, с которыми они связываются. Поэтому практически ко всем типам устройств можно применить одни и те же функции и операции ввода–вывода, так как программа на языке С++ только рассматривает поток байтов, при этом ей не надо знать, откуда эти байты поступают или куда передаются.
Иными словами, поток можно определить как абстрактный канал связи (логический интерфейс), который создаётся в программе для обмена данными с внешними устройствами. Поток связан с внешним устройством с помощью системы ввода–вывода С++.
Ввод–вывод данных для увеличения скорости их передачи производится, как правило, через специальную область памяти – буфер. Фактически передача данных выполняется при выводе после заполнения буфера, а при вводе – если буфер исчерпан.
По направлению передачи данных различают:
потоки ввода (входные потоки) – из которых извлекаются (читаются) данные и передаются в программу;
потоки вывода (выходные потоки) – в которые вставляются (записываются) данные из программы;
потоки ввода–вывода (двунаправленные потоки) – допускающие чтение и запись данных.
По виду устройств, с которыми работает поток, потоки делятся на:
стандартныепотоки – предназначены для передачи данных от клавиатуры и на экран дисплея;
файловые потоки – предназначены для обмена информацией с файлами на внешних носителях данных (например, на диске);
строковые потоки – предназначены для работы с массивами символов в оперативной памяти.
Существует два типа потоков – текстовый и двоичный (бинарный).
Текстовый поток используется для ввода-вывода символов. При этом могут происходить некоторые преобразования. Например, при выводе символ новой строки (числовой код 10) может быть преобразован в последовательность символов – возврата каретки и перехода на новую строку (с кодами 13 и 10 соответственно). Поэтому может не быть взаимно-однозначного соответствия между тем, что посылается в поток, и тем, что в действительности записывается на внешнее устройство. При вводе выполняется обратное преобразование.
Двоичные потоки – последовательность байтов, имеющих однозначное соответствие с байтами на внешнем устройстве. Никакого преобразования символов не выполняется. Поэтому количество прочитанных (записанных) байтов в точности совпадает с количеством байтов на внешнем устройстве.
Двоичные потоки обеспечивают неформатированный ввод–вывод (в/ы на низком уровне). Они позволяет осуществить пересылку больших по объёму данных с высокой скоростью. Программисты же предпочитают иметь дело с текстовыми потоками, т.е. с форматированным вводом–выводом (в/ы на высоком уровне).
В С++ система ввода–вывода использует заголовочный файл <iostream>, в котором для поддержки операций ввода–вывода определена довольно сложная иерархия классов. В основе иерархии классов лежит класс ios, являющийся базовым по отношению к классам istream, ostream и iostream, которые представляют собой классы потоков ввода, вывода и ввода–вывода соответственно.
Включение в программу заголовочного файла <iostream> даёт ей возможность иметь доступ к классу ios, который содержит множество функций и переменных для управления основными операциями над потоками.