Г. Шилдт - Полный справочник по C++ (1109478), страница 79
Текст из файла (страница 79)
После этого программа сбрасывает флаг пррелсеве и снова выводит число 100.12 в научном формате, на этот раз используя строчную букву "е". Ефпс1цде оаовегеаю> цв<пд пеюеврасе вей; апс иа1п() ( соцд.вееб(зов::цррехсаве ) <ов::всаепе<х<с) соцс « 100.12: // Выводим число 1.0012В+02 соцс.цпвесб(аов: цррехсаве); // Сбрасываем флаг цррегсаве соде « "' Ы" « 100.12; // Выводим число 1.0012е+02 хегцгп 0: Часть й. Язык С++ Перегруженная форма функции Вел Функция веев() имеет перегруженную форл~у. й гшсд1адв вес1(хшс11едв флага/, бшс11адв флага2]; В этой версии изменяются только флаги, заданные параметром флаги2. Сначала они сбрасываются, а затем устанавливаются в соответствии со статусами флагов, заданных параметром флага1. Обрати~с внимание на то, что даже если параметры флаги! и флаги2 относятся к разным флагам, изменяются ~ольке флаги, заданные параметром флага2.
Функция возвращает предыдуп(ее состояние флагов. Е)пс1ибе <1овдгеаш> ивупд пашеврасе всб," 1пс шазп( ) ( сеид. ведй (1ов =: вЬоирозпд ! 1ов:: вбоиров, 1ов:: вЬоирозпс) ) сеид « 100.0; // Выводит на экран число 100.0, а не +100.0 тедигп 0; ) Программа устанавливает флаг вЬоиро1пе, а не вЬоиров, поскольку флаг вЬоиров не указан во втором параметре. $1пс1ибе <1овг геат> ивзпд пашеврасе вдб; Тпс шазп() ( соис. весг (1ов:;Ьех, Тов::ЬавеТ1е10) соде « 100; // Выводит на экран число 64 гесидп 0; ) В этой программе сначала сбрасываются флаги ьавея1езе (т.е.
флаги пес, осе и ьех), а затем устанавливается флаг ьех. Помните, что соси)анне флагов, заданных параметром флаги1, влияет только на флаги, заланные параметром флага2 Например, в слелуюшей программе первая попытка установить флаг ллаирцг оказывается неудачной. // Эта программа не работает. $1пс1иг)е <1овсхевт> ивупд пашеврасе всс); 1пс шазп() ( соде.веет(1ов::вЬоъров, 1ов::Ьех); // Ошибка, тлаг // вЬоиров не установлен. сеид « 100 « '1п'; // Выводит на экран число 100, а не +100 соис.весг(1ов::вЬоъров, Тов::вьоиров); // правильно соис « 100; // Теперь на экран выводится число +100.
Глава 20. Основы системы ввода-вывода Учтитс, что в большинстве случаев для сброса флагов используется функция ипвесс(), а для установки флага выз)лаастся функция вест() с одним параметром. В более сложных случаях, например, при выводе основания системы счисления слслуст вызывать функцию вася(йвся1адв, ктскзадв). Кремс того, иногла программисгы созда)от шаблон всех флагов формата, описывающий прслстаалснис чисел, а затем пытак)ся изменить один или два флага.
В этом случае шаблон задают с помощью параметра флаги/, а нзмснясмыс флаги псрсчисляют в параметра грааги2 Проверка флагов форматирования Иногда необходимо то аю опрсдслить тскушсс состояние формата, нс изменяя ого флаги. Для этого в классе 1ов используется функция- ~лен е1адвО, которая аозарашаст тскушсс состояние каждого флага Оюрмата. Ес прототип имеет следуюший вид. В гтгг1адв г1адв(]; В слслуюшсй программе эта функция применяется для установки Флаке форматирования, связанных с потоком соус. Обратите особое внимание на функцию в)тоит1адв () .
Она можст оказаться полезной. $1пс1пс)е <1овсгеат> овхпд паиеврасе всй; уоЫ виоиб1адв() 1г1с юа1п(! // Показать состояние флагов формата. // предусмотренное по умолчанию. впоюг1адв О; соек.веСГ(1ов::гад)тт ~ гов::вноирогпС ~ 1ов: магией); впои11адв(); геспгп О; ) // Функция выводит на экран состояние флагов формата. чоЫ вйоиг1адв О ( 1ов:: Гисг1адв 1; 1опд 1; Е = (1опд) сопС.Г1адв О; // Получить состояние флагов. // Проверить кажгмй флаг Оог(1=Ох4000; 1; 1 = 1 » 1) 11(1 а г) соиг « "1 е1ве сопс « '0 соус « ' 1п"; Часть )!. Язык С~+ Ниже показаны результаты работы этой программы. (Зги установки зависят от компилятора.) 0 0 0 0 0 1 0 0 0 0 0 О 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 О 0 1 Установка всех флагов Функция н1адвО имссг вторую форму, позволяюшую устанавливать нес флаги формата, связанные с по~оком.
Прототип этой версии функции В1адв О показан ниже. й йшсй1адв (1адв(йшсй1адв /) з В этой версии параметр / залае~ битовый шаблон флагов формата, связанных с конкретным потоком. Таким образом, изменя)отса сразу все флаги г)юрлзатированзгя. Функция возврашает предьшушее состояние флагов. Эта версия функции е1адвО иллюстрируется следуюшей программой. Сначала она создаст битовую маску, в которой установлены флаги в)зондов, в)зон)заве, осе и т1д)зе. Все остальные флаги сброшены. Затем для установки флагов форматирования, связанных с потоком попе, используе~ся функция в1адво Функция в)зомв1адв() выводит ца экран состояние флагов форматирования.
(Зто та жс функция, которая была определена в предыдущем примере.) С(пс1иг)е <1овт сей> пвапд пашеврасе вМз уоЫ в)зоиГ1адв() з.пс шаз.п() // Выводим нв экран состояние з)златов (зормата, // предусмотренное по умолчанию. в)зоил1адв () з // Флаги в)зефиров, в)зоиЬаве, осе и гьднс установлены, // остальные сброшены. 1опд б = 1овззв)зоыров ! 1ов:звноиЬаве ! 1ов:зосс ) 1овззг1д)зс; соцс.11адв(Г)з // Задаем состояние всех (златов.
в)зоил1адв () гесцгп Оз Применение функций ))(ГЫЙЦ, ргес)в)опт и Я(3 В классе 1ов прелусмотрсны три Функции-члена, позволяюгцие изменять ширину поля выводя, точность и символ-заполнитель. Они называются м1ззецО, рвесд— в1оп() и В111() соответственно. Рассмотрим кнждузо из них в отдельности. По умолчанию количество позиций, которые занимает число при выволе, равно количеству символов, из которых оно состоит. Однако сузцествуст вазможность изменить минимальную ширину поля вынода, используя функцию мазза)з().
Ее прототип показан ниже. В встеашвьае ыЫс)з(всгеашвдае м) з Функция возвращает предьиушую ширину поля, а ее новос значение задается параметром в. В некоторых реализациях ширина поля должна задаваться при каждом вы- Глава 20. Основы системы ввода-вывода воде. Если этого не сделать, используется се значение, предусмотренное по умолчанию. Тип вслеаввхае представляет собой адин из вариантов типа хпс, причем конкретный выбор зависит от компилятора.
Если число не целиком заполняет палс, оно дополняется символомзаполни~елем (по умолчанию — пробелом), чтобы длина числа совпадала с шириной поля. Если число не помещается в поле вывода, оно все равно выводится полностью. Уссченис чисел нс производится. При выволс действительных чисел можно задавать количество цифр после десятичной ~очки (точность числа), используя функцию рлес1в1оп() . Ес прототип представлен ниже. $ вслеаювзае рлесзв1оп(вслеал!вьае р) Функция возвращает старое значение, а новое количество цифр после десятичной точки задается параметром р. По умолчанию после десятичной точки выводится б цифр.
В некоторых реализациях это значение следует задавать перед каждым выводом, иначе будет использоваться точность, предусмотренная по умолчанию. Кроме того, если поле вывода не заполнено, оно автоматически дополняется пробелами. Символ-заполнитель можно изменить, использовав функцию г111(). Ес прототип имеет следующий вил. $ с)1ат 1111(сЬал сь) ! Функция йз11() возвращает старый символ-заполнитель, а новым заполлителем становится символ с/!. Рассмо~рим программу, иллюстрирующую применение этих функций.
41пс1ог)е <1овслеало лвьпд латеврасе все! алс ваап() соле.рхесьвзоп(4) соцс.иг<)с)г(10) ! соил « 10 12345 « "хп"! // Выводит на экран 10.12 соле.л111('<')! соле.ъ1<)с)т(10); соса « 10.12345 « "Хп": // Выводит на экран * *"*10.12 // Ширина паля вывода распространяется и на строки с. Ысл(10)! соле « "Нз!" « "хп"! // Выводит *<****"Нь! соле.иг<)С)г(10)! соле.веей(ьов::1еле)! // Выравнивает ло левому краю соил « 10.12345! // Выводит на экран 10.12***** легллп 0; ) Результат работы этой программы выглядит так. | 10.12 ***<*10.12 ****<**на 10.12***** Часть П. Язык С++ Функции м1бсь(1, ркес1в1оп(1 и Е111(1 имеют псрсгружснныс версии, получающие, на нс изма((яющис саатвстствугащис параметры потока.
| спат ЕШ (?; в? сеаювззе нзбсь(1( вгкеамвззе рхесхвхап(1( Другой способ измспсния формата основан нв применении специальных функций, называемых манипуляторами (глав!рц1а(агз). Их можно включать в операторы вводавы вада. Стандартные манипуляторы перечислены в табл. 20.1. Таблица 20Л. Манипуляторы Л(знилуляторы Предназначение Ввод-вывод Ввод-вывод Вывод Ьсо1в1рЬе пес еэ аз епае Е1пес Езпвь Ьеи эпьектзв1 Хесе поЪсозв1рьв псвьсмЬеве поВЬомро1пк повьомров повь1рмв пспп1сьпЕ по|эррексвне кпвесзоеЕХедв (ЕпсЕХедв Г) кэдЬС всхепс111с весьвве(1пс лаве) Вывод Ввод-вывод Вывод Вывод Вывод Вывод Вывод Ввод Вывод Вывод Ввод векл11Х (1пе СГЛ весаовЕХвдв(ЕвЮЕХвдв Е? веоркео1взоп (Хпе р? веем(эпс гк? еЬомьеве вЬомров вн1рмв ппгсьпЕ пррексеве Глава 20. Основы системы ввода-вывода Применение манипуляторов формата Устанавливает флаг Ъсо1вхрье устанавливает Флаг вес Выводит символ пврекода на новую строку и очи- щает буфер Выводит нулевой байт Устанавпивавтфлаг Езмеа Очищает буфер Устанавливает флаг ьем Устанавливает флаг Хпкекпв1 Устанавливает флаг 1елс Сбрааывает флаг ЬсозехрЬа сбрасывает Флаг вьо ъаве Сбрасывает флаг впомрс1пв Сбрасывает флаг вьомров Сбрасывает флаг вщрмв Сбрасывает Флаг ппзсьпе Сбрасывает флаг прре*севе Усганавпивает флаг осе Сбрасывает флаги, указанные параметрам Г Устанавливает флаг кэдьс Устанавливает флаг вс1епсХЕХс Задает основание системы счисления, укаэанное параметром лазе Задает символ-заполнитель сл Устанавливает Флаги, указаннью параметрам ( Задает копичеатва цифр после десятичной точки Задает ширину поля, указанную параметром иг Устанавливает Флаг ввомЬвве Устанавливает флагвьомро1пс Устанавливает флаг впомров Устанавливает Флаг в(сьрмв Устанавливает Флаг пп1сьпЕ Устанавливает флаг пррексеве Игнорирует ведущие разделители Вывод Вывод Вывод Ввод-вывод Вывод Вывод Ввод-вывод Вывод Вывод Вывод Ввод Вывод Вывод Ввод-вывод Ввод-вывод Вывод Вывод Ввод-вывод Для доступа к манипуляторам, получающим параметры (например, к функции вес>г() ), необходимо включить в программу заголовок <1овааАр>.
Рассмотрим пример, иллюстрир)тощий применение манипуляторов. $1пс1ие(е <1овегеае> зьпс1ип)е <аогпапар> ивппд пагпеарасе вег); йпс па1п(] ( саие «)пех «100 «еп41; соие «весг111( '? ' ) «веси! 10) «2343. 0; гесигп О( Результаг работы программы приведен ниже. 64 »п»>2343 Обратите внимание на то, как манипуляторы включаются в операторы вывода. Кроме того, если манипулятор не имеет аргументов (например, епй1), скобки после него не ставятся, поскольку его имя является адресом, церелаваемым перегруженному опера~ору "«".
Для сравнения приведем функционально эквивалентную версию предыдущей программы, в которой используются функции — члены класса аов. 41пс1ип)е <ьовсгеат> зьпс1ибе <1оаап1р> иакпд паппеврасе все)г апе паапО ссис.весй(1ов::)1ех, ьов::)павей1е1с)); соил « 100 « " 1п"г // Числа 100 а шестнадцатеричном виде соие.т111('?')г соис.и)<)с)п(10)г е 2343.0; гееигп 0; Как видим, основнос преимущество манипуляторов над функциями — членами класса зов заключается в компактности кода. используя манипулятор вее1овк1адв(), можно установить сразу все флаги формата, связанные с потоком. Например, в следующей программе манипулятор вее1овк1адв () применяется для установки флап)в ацоиьаее и в)поиров.