Г. Шилдт - Полный справочник по C++ (1109478), страница 78
Текст из файла (страница 78)
Именно поэтому старая и новая библиотеки ввода-вывода совместимы на уровне исходною кода. И последнее: класс Хов солержит большое количество Функций-членов и переменных, управляющих основными операциями над потоками или наблюдающих за их выполнением. Мы булем часто на него ссылаться. Просто следует помнить: включая в программу заголовок <Еовегеаю>, вы получаете доступ к этому важному классу. 417 Глава 20. Основы системы ввода-вывода Как известно, для системы енола-нывода необходим заголовок <Еовегеюв>. В этом заголовке определена довольно сложная иерархия классов, подаерживюоших операции ввода-вынода.
Сначала определяются шаблонные классы ввода-вывода. Как указывалось в главе 18, шаблонный класс представляет собой схему, н которой не уточняется тип данных, которыми она оперирует. После определения шаблонных классов можно создавать их конкретизации. Стандарт языка Се+ создает две специализации шаблонных классов ввода-вывода: одну для восьмибитовых символов, а другую — для расширенных.
В книге используются только классы для восьмибитовых символов, гюскольку они применяются более широко. Однако описанная технология применима и к расширенным символам. Система ввода-вывода языка С++ построена на основе двух родственных, но разных иерархий шаблонных классов. В основе первой иерархии лежи~ класс ЬавЕс вегеавЬсЕ, предназначенный для низкоуровневого ввода-вывода. Если в программе не используются особые процедуры ввода-вывода, класс ЬавХс вегеамЬиЕ, как правило, не нужен. В обычных приложениях чаше всего применяется иерархия классов, построенная на основе класса Ьавьс Хов, обеспечивающего высокоуровневые операции ннода-вывода, проверку ошибок и анализ информации о статусе потоков.
(Класс Ьавьс Еов является произнодным от класса Еов Ьаве, определяющего некоторьте нешаблонные свойства, используемые классом ЬавХс Еов.) Класс ЬавЕс Еов используется в качестве базового для нескольких производных классов, в частности ЬавЕс э.вегааю, ьавХс овегеюв и Ьавбс Еовсгеаяь Зти классы применяются для создания потоков, обеспсуинаюших соответственно ввод, вывод, а также ввод-вывод. Как известно, библиотека ввола-вывода создает две специализации ~наблонных классов, вхолящих в иерархию: одну для восьмибитовых символов, а другую — для расширенных.
Ниже приводится список имен шаблоннгях классов, предназначенных для ввода-вывода обычных и расширенных символов. Встроенные потоки в языке С++ В начале выполнения программы на языке С++ автоматически открываются четыре потока. Потоки Зкачеяяе устройство ло умвлчаяию Стандартный ввод Стандартный вывод Стандартныи вывод ошибок Буферизованный вариант потока ввгг Клавиатура Экран ЭкРан Экран вове свгг стоя Потоки одп, еопе и еегг соответствуют потокам ведхп, веттопе и веттегг. По умолчанию стандартные потоки используются для взаимодсиствия с консолью. Однако в операционных систелтах, поддерживающих перенаправление потоков ввода- вывода (таких как 00з, (/шх, Оау2 и %)пт)окуз), стандартные потоки можно связать с другими устройствами или файлами.
Для простоты в примерах мы не булсм применять перенаправление потоков. Кроме того, язык С+ч определяет четыре до~1олнительттых потока: мз.п, мопс, ыегг и ы1 ь. Это версии потоков дчя ввода-вывода расширенных символов. Для преда.веления расширенных символов используется тип ысьаг е и 1б-битовыс значения. Как правило, расширенные символы применяются лля поддержки некоторых естественных языков. -: Форматированный ввод-вывод Форматирование с помощью членов класса!ов Каждый поток связан с набором флагов форма~а, управляющих представлением информации. Класс дов объявляет битовую маску под названием Етквд1адв, в которой опрелеляются следующие значения. (С технической точки зрения зтн значения определены в классе дов Ьаве, когорый является базовым по отношению к классу 1ов.) абЗпвг.б(е1сз Ягела 1ебс вЬоыЬаве пп1СЬпб Ьааебхе1тз Е1оаетт е1Й Ьоо1а1рпа Ьех гтппс аьоыров бес тпсегпа1 вс1епедетс вк1рыв осе вйоыродпг пррегсаае Эти значения использутотся лля установки и сброса флагов формата.
При работе со старыми компиляторами невозможно определить перечисление йвеб1вдв. В таком случае флаги формата копируются с помощью значений, имеющих тип 1опть Часть 11. Язык С++ Язык С++ позволяет выполнять операции форматированного ввода-вывода. Например, можно задать ширину поля, указать основу счисления или определить количество цифр после десятичной точки. Для форматирования данных можно применять два похожих, но разных способа. Во-первых, можно прямо обраппься к членам класса лов. В частности, можно самостоятелыю задавать различпыс флаги форматирования, опрслеленныс внутри класса дов, или вызывать разнообразныс Функции-члены. Во-вторых, в выражениях ввода-вывола можно использовать специальные функции, называемые манилулгилорами (птап)рц!агогз).
Рассмотрим сначала средства форматированного ввода-вывода с помощью флагов и функций — членов класса 1ов. Если установлен флаг в(с1рив, при вводе данных из потока разлслитсли (пробелы, знаки табуляции и символы псрсхола на новую строку) иыюрируются. Если этот флаг сброшен, разделители учитываются. Если установлен флаг 1ехс, строки вывода выравниваются по левому краю. Если установлен флаг кйдце, строки вывода выравниваются по правому краю.
Если установлен флаг 1пеевпе1, между знаком числа и его псрвой цифрой пробелы всшвляются так, чтобы число заполнило собой все поле вывода. Если ни один из этих флагов не установлен, по умолчанию выполняется выравнивание по правому краю. По умолчанию числовые значения выводятся в десятичном виде. Однако основание системы счисления можно измснить. Для вывода восьмеричных чиссл предназначен флаг осе. Установка флага цех позволяст выводить числа в шестнадцатеричном виде. Вывод чисел в десятичном формате обеспс (ивается флагом оес. Установка флага вцомьаве позволяет вывести на экран основание системы счисления.
Например, при выводе шестнадцатсри шых чисел значение 1Е будет представлено как Ох!а Г!ри выводс чисел в научном формате буква е по умолчанию выволится как строчная. Кроме топь буква х в восьмеричном представлении чисел также считается строчной. Если необходимо вывести эти буквы как прописные, следует установип флаг пррексеве. Установка флага вцоиров поз~юляст вывести знак перед положительными числами. Установка флага вцоеро3пе позволяет выв(дить десятичную точку и незначащие нули при отображении десятичных чисел. Если установлен флаг ве1пеьех1е, число выводится в научном форматс.
Если установлен флаг дьхест, дссятичнос число выводи~ся в обычном вилс. Если ни один из этих флагов не установлен„компилятор сам выбирает подходящее прслставлсние чисел, если установлен флаг пп1еъпв, то после каждой операции вставки буфер о пинается. Флаг ьоо1е1рье позволяет вводить и выводить булевскис значения евое и де1ве. Поскольку числа обычно выводятся в десятичном, восьмсричиол1 и шестнадцатеричном виде, поля бее, осе и цех называ(от общим именем ЬавеЫе1г1 Аналогично поля 1еке,в1дье и 1пеевпе1 называютеет5пведйе1д Кроме того, поля веьепеьв1с и дьхеа объединяют обшил( именем д1оеедье1д.
Установка фларов формата Для установки флага используется функция вест(1. Эта функция является членом класса 1ов. Она имеет следующий вил. $ йпгь1адв весГ (сеет1адв флаги! Данная функция возврагцаст текущее состояние флагов формата, отме генных параметром флаг, и устанавливае~ их. Например, чтобы установить флаг вцоиров, можно применить следующий оператор. $ хгеам. весг (ьов:: вйоиров(; Здесь имя з(геал( означает поток.
на который вы хотите повлиять. Обратите внимание на префикс 1ови ю перед флагом вапиров. Он необходим, поскольку флаг вцоиров является персчислимой константой, определенной в классе 1ов, Следующая программа выводит на экран число 100, устанавливая флаги вцоиров и вцоиро1пе.
| еьпс1пйе <ьовгвеап> пвьпд папеврасе вМ; Глава 20. Основы системы ввода-вывода 1пс махп() соцд.веСГ(уев::в)зоъро<пд) соцс.весг(аов::впоыров); соде « 100.0; // Выводим число +100.0 гегцгп 0; Следует помнить, что функция вееб<) является членом класса 1ов и влияет на потоки, созданные этим классом. Следовательно„любой вызов функции вееб() связан с конкретным позоком.
Сама по себе функция вееб() никогда не вызывается. Иначе говоря, в языкс С++ нет концепции глобального статуса формата. Каждый поток поддерживает свой собственный статус. Хотя предыдущая программа является синтаксически правильной, ее можно переписать и сделать более эффективной. Вместо нескольких вызовов функции вееб() можно примени~ь к ее аргументам логическую операцию '*ИЛИ". Например, предыдущие вызовы можно заменить одним. // К флагам можно применять логическую операцию "ИЛИ" соцс.вест(аов::в)тоыроапс ( аов::вапиров); Поскольку флаги фориата определены е классе зов, доступ к ним осущестеляепюя с помои(ью имени аов и операпюра' разрешения области видимости. Например, сем по себе фпгг ваомаове не распознается.
Необходимо упючнить его имя гов: гвреозву. Сброс флагоа формата Антиподом функции весб<) является функция цпвееб(). Эта функция — член класса 1ов — используется для сброса одного или нескольких флагов формата и имеет следующий вид а чоад цпвееб(бюдс1адв флаги) Данная функция сбрасывает флаги, заданные своим параметром. (Все остальные флаги сохраняют свое прежнее состояние.) Функция г пвееб < ) иллюстрируется следующей программой. Сначала она устанаелиааст флауи иррехсвве и вс1епеЫао, затем выводит число 100.12 в научном формате. В дащюм случае научный формат числа содержит прописную букву "Е".