Читайте также: |
|
ГЛАВА 15. ВВОД-ВЫВОД
Потоки
Стандартные потоки ввода–вывода
Форматирование данных
· Флаги форматирования
· Функции форматирования
· Манипуляторы ввода-вывода
Обмен информацией между программой и внешними устройствами осуществляется с помощью операций ввода–вывода. В языке С++ нет специальных операторов для ввода–вывода. Вместо этого просто имеется набор классов, поставляемых вместе с компилятором, которые и реализуют основные операции ввода–вывода.
Библиотека классов обеспечивает эффективный ввод–вывод всех встроенных типов и простое, но, тем не менее, гибкое определение операций ввода–вывода для типов, разрабатываемых программистом.
Потоки
В основе системы ввода–вывода (сокращённо – в/ы) языка программирования С++ лежит понятие потока, при помощи которого выполняются операции ввода–вывода.
Поток ( stream ) – это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея, дисковод). У всех создаваемых в программе потоков характер поведения одинаков, несмотря на различные внешние устройства, с которыми они связываются. Поэтому практически ко всем типам устройств можно применить одни и те же функции и операции ввода–вывода, так как программа на языке С++ только рассматривает поток байтов, при этом ей не надо знать, откуда эти байты поступают или куда передаются.
Иными словами, поток можно определить как абстрактный канал связи (логический интерфейс), который создаётся в программе для обмена данными с внешними устройствами. Поток связан с внешним устройством с помощью системы ввода–вывода С++.
Ввод–вывод данных для увеличения скорости их передачи производится, как правило, через специальную область памяти – буфер. Фактически передача данных выполняется при выводе после заполнения буфера, а при вводе – если буфер исчерпан.
По направлению передачи данных различают:
· потоки ввода (входные потоки) – из которых извлекаются (читаются) данные и передаются в программу;
· потоки вывода (выходные потоки) – в которые вставляются ( записываются ) данные из программы;
· потоки ввода–вывода (двунаправленные потоки) – допускающие чтение и запись данных.
По виду устройств, с которыми работает поток, потоки делятся на:
· стандартные потоки – предназначены для передачи данных от клавиатуры и на экран дисплея;
· файловые потоки – предназначены для обмена информацией с файлами на внешних носителях данных (например, на диске);
· строковые потоки – предназначены для работы с массивами символов в оперативной памяти.
Существует два типа потоков – текстовый и двоичный (бинарный).
· Текстовый поток используется для ввода-вывода символов. При этом могут происходить некоторые преобразования. Например, при выводе символ новой строки (числовой код 10) может быть преобразован в последовательность символов – возврата каретки и перехода на новую строку (с кодами 13 и 10 соответственно). Поэтому может не быть взаимно-однозначного соответствия между тем, что посылается в поток, и тем, что в действительности записывается на внешнее устройство. При вводе выполняется обратное преобразование.
· Двоичные потоки – последовательность байтов, имеющих однозначное соответствие с байтами на внешнем устройстве. Никакого преобразования символов не выполняется. Поэтому количество прочитанных (записанных) байтов в точности совпадает с количеством байтов на внешнем устройстве.
Двоичные потокиобеспечивают неформатированный ввод–вывод (в/ы на низком уровне). Они позволяет осуществить пересылку больших по объёму данных с высокой скоростью. Программисты же предпочитают иметь дело с текстовыми потоками, т.е. с форматированным вводом–выводом (в/ы на высоком уровне).
В С++ система ввода–вывода использует заголовочный файл< iostream >, в котором для поддержки операций ввода–вывода определена довольно сложная иерархия классов. В основе иерархии классов лежит класс ios, являющийся базовым по отношению к классам istream, ostream и iostream, которые представляют собой классы потоков ввода, вывода и ввода–вывода соответственно.
Включение в программу заголовочного файла< iostream > даёт ей возможность иметь доступ к классу ios, который содержит множество функций и переменных для управления основными операциями над потоками.
Стандартные потоки ввода–вывода
При включении в программу заголовочного файла <iostream> для в/ы информации в стандартные потоки автоматически будут созданы следующие объекты:
· cin – объект класса istream, соответствует стандартному потоку ввода, даёт возможность программе вводить данные с клавиатуры;
· cout – объект класса ostream, соответствует стандартному потоку вывода, даёт возможность программе выводить данные на экран;
· cerr, clog – объекты класса ostream, соответствуют стандартным потокам вывода сообщений об ошибках, позволяют программе выводить на экран сообщения об ошибках.
Операция сдвига влево (<<) используется для вывода в поток и называется операцией вставки в поток. Операция сдвига вправо (>>) используется для ввода из потока и называется операцией извлечения из потока. Эти операции обычно применяются к стандартныv потокам cin и cout:
…
int a; cin>>a; // ввод с клавиатуры
cout<<"a = "<<a; // вывод на экран
Операции извлечения из потока и вставки в поток в качестве результата своего выполнения формируют соответственно ссылки на объект типа istream или ostream, что позволяет создавать цепочки операций.
Как и для других перегруженных операций, для операций извлечения и вставки невозможно определить приоритеты, поэтому в необходимых случаях используются скобки:
cout<<(i << j); // операция << в скобках означает сдвиг влево
Данные при вводе из потока должны разделяться пробельными символами (пробелами, знаками табуляции или символом перехода на новую строку). Ввод прекращается, если очередной символ оказался недопустимым.
Операции << и >> перегружены для всех встроенных типов данных, строк и значений указателей, что позволяет автоматически выполнять ввод–вывод в соответствии с типом величин:
int i = 1; double d;
cin>>d; // символы из потока преобразуются в double
cout<<i<<' '<<d; // int и double преобразуются в символы
Числовые значения можно вводить в десятичной или шестнадцатеричной системе счисления (с префиксом 0х), со знаком или без знака. Вещественные числа представляются в форме с фиксированной точкой или в виде мантиссы и порядка.
При вводе строк извлечение символов из потока происходит до ближайшего пробела. Вместо него в строку заносится нуль-символ – ' \0 ', который является признаком конца строки (см. главу 10).
Под любую величину при выводе отводится столько позиций, сколько требуется для её представления. Чтобы отделить одну величину от другой, используются пробелы:
cout<<i<<' '<<j<<" "<<k;
Поскольку ввод буферизирован, помещение в буфер ввода происходит после нажатия клавиши Enter строки, после чего из буфера выполняется операция извлечения из потока. Это даёт возможность исправлять введённые символы до того, как нажата клавиша Enter.
Дата добавления: 2015-07-10; просмотров: 149 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Граница | | | Fstreamfio; // поток ввода–вывода (объект) fio |