Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Лекция 8

Потоки ввода/вывода служат посредником между программой и источником или местом назначения потока. Такой абстрактный подход позволяет программе на С++ трактовать ввод данных с клавиатуры точно так же, как и ввод данных из файла, из сетевого соединения, при этом приложение просто получает набор байт, не нуждаясь в дополнительной информации о том, откуда эти данные.

Управление вводом включает две стадии:

  1. Ассоциирование потока с вводом

  2. Подключение потока к источнику

Управление выводом предусматривает ассоциирование вывода с местом назначения и подключение этого вывода к выходному ресурсу.

Ввод/вывод эффективнее при использовании буфера.

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

Чтение из файла, находящего на диске, по одному символу требует множества операций обращения к источнику и выполняется медленно.

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

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

Клавиатурный ввод поставляет символы по одному. Для него не нужен буфер. Однако, буферизированный клавиатурный ввод обеспечивает пользователю возможность вернуться и исправить ввод до того, как он будет передан в приложение.

Обычно программа очищает буфер ввода при нажатии клавиши Enter. При выводе данных обычно очищается буфер при наличии символа новой строки /n.

Потоки, буферы и файл iostream

Заголовок <ios> определяет основные типы и функции для работы с потоками ввода/вывода. В нем определено три класса для реализации задач ввода/вывода:

  • basic_ios

  • fpos

  • ios_base

Класс ios_base описывает особенности ввода/вывода общие для входных и выходных потоков, которые не зависят от параметров шаблона.

Класс basic_ios является шаблонным и описывает свойства общие как для входных потоков (шаблона класса basic_istream), так и для шаблонных потоков вывода (шаблона класса basic_ostream), которые зависят от параметров шаблона.

Класс basic_istream описывает объекты, управляющие извлечением элементов.

Класс istream является производным от basic_ios и предоставляет методы ввода данных. Класс istream предоставляет собой реализацию шаблонного класса basic_istream для типа char. Класс istream представляет собой псевдоним шаблона Класса basic_istream, специализированного для элементов типа char.

Класс basic_ostream описывает объекты, управляющие вставкой элементов в буфер потока. Класс ostream является производным для класса basic_ostream предоставляет методы для реализации вывода. Класс ostream представляет собой реализацию шаблонного класса basic ostream для типа char. Класс ostream представляет собой псевдоним шаблонного класса basic_ostream специализированного для элемента типа char.

Класс iostream производный от basic_istream и basis_ostream одновременно, который позволяет предоставлять методы ввода и вывода данных в поток. Класс iostream предоставляет собой реализацию шаблонного класса basic_iostream , который реализует вставку данных через класс basis_ostream извлечение данных через класс basic_istream.

Для того, чтобы реализовать интернационализацию в язык С++ внедрены символьные типы в 16 бит. Традиционный 8-битный тип char (“узкий”) дополняется символом wchar_t (“широкий”), который позволяет обрабатывать большее количество символов.

Аналогично типам istream и ostream , которые настроены для работы с типом char , типы wistream и wostream предоставляют собой специализацию basic_istream и basis_ostream для типа wchar_t .

При создании приложения автоматически создаются объекты потока ввода/вывода как широких, так и узких символов:

  • cin wcin

  • cout wcout

  • cerr wcerr

  • clog wclog

Объект cin представляет собой стандартный поток ввода, который по умолчанию ассоциируется с клавиатурой, wcin аналогичной cin, но работает с wchar.

Объект cout представляет собой стандартный поток вывода и по умолчанию ассоциируется с консолью (экраном). Объект wcout аналогичен cout, но работает с типом wchar.

Объект cerr представляет собой стандартный поток вывода ошибок, по умолчанию не буферизируется.

Объект clog соответствует стандартному потоку вывода ошибок, буферизируется и вывод данные на экран.