Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по ППВиС (17 шт, ppt) Романов ВИ 2011 1ый семестр / Л11_Форматирование ввода вывода

.ppt
Скачиваний:
46
Добавлен:
15.06.2014
Размер:
1.08 Mб
Скачать

1

Форматирование

Форматы ввода-вывода зависят в основном от двух факторов. Первый – специальные форматные флаги, другой – их настройка под национальные стандарты.

Класс ios_base содержит ряд переменных, предназначенных для определения форматов ввода-вывода. В частности, эти переменные определяют минимальную ширину поля, точность вывода вещественных чисел и заполнитель. Переменная типа ios::fmtflags содержит флаги конфигурации, которые определяют, нужно ли выводить знак перед положительными числами, должны ли логические значения выводиться в числовом или символьном виде и т.д.

Некоторые форматные флаги составляют группы. Определены специальные маски, упрощающие работу с группами.

Имеются три стандартные маски:

adjustfield = internal | left | right basefield = dec | oct | hex

2

Форматирование - функции

 

Функции определения форматов

Функция

Описание

setf(флаги)

Устанавливает флаги, переданные в аргументе, в

 

качестве дополнительных форматных флагов и

 

возвращает предыдущее состояние всех флагов

setf(флаги,маска

Устанавливает флаги, переданные в первом

)

аргументе, в качестве форматных флагов для

 

группы, которая идентифицируется маской,

 

переданной во втором аргументе, и возвращает

 

предыдущее состояние всех флагов

unsetf(флаги)

Сбрасывает флаги, переданные в аргументе

flags()

Возвращает весь набор форматных флагов

flags(флаги)

Устанавливает флаги, переданные в аргументе, в

 

качестве новых форматных флагов и возвращает

 

предыдущее состояние всех флагов

copyfmt(поток)

Копирует все определения форматов из потока,

 

переданного в аргументе

3

 

Форматирование - флаги

 

Флаги форматирования

Флаг

Назначение

skipws

при вводе пробельные литеры пропускаются

left

выводимые данные выравниваются по левому краю с дополнением

 

символами-заполнителями по ширине поля

right

выводимые данные выравниваются по правому краю с

 

дополнением символами-заполнителями по ширине поля

 

(установлен по умолчанию)

internal

при выравнивании символы-заполнители вставляются между

 

символом знака или префиксом основания системы счисления и

 

числом

dec

целые числа выводятся по основанию 10 (установлен по

 

умолчанию); устанавливается также манипулятором dec

oct

целые числа выводятся по основанию 8; устанавливается также

 

манипулятором oct

hex

целые числа выводятся по основанию 16; устанавливается также

 

манипулятором hex

4

 

Форматирование – флаги (продолжение)

 

Флаги форматирования

Флаг

Назначение

showbase

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

 

основание системы счисления

showpoint

при выводе чисел с плавающей запятой всегда отображается

 

десятичная точка, а хвостовые нули не отбрасываются

uppercase

шестнадцатеричные цифры от А до F, а также символ экспоненты Е

 

отображаются в верхнем регистре

showpos

при выводе положительных чисел отображается знак плюс

scientific

числа с плавающей запятой отображаются в научном формате (с

 

экспонентой)

fixed

числа с плавающей запятой отображаются в фиксированном

 

формате (без экспоненты)

unitbuf

при каждой операции вывода буфер потока должен очищаться

stdio

при каждой операции вывода буферы потоков stdout и stderr

 

должны очищаться

5

Манипуляторы работы с флагами

Установка и сброс флагов форматирования можно

осуществлять при помощи пары манипуляторов: setiosflags(флаги) – установка передаваемых флагов

resetiosflags(маска) – сброс флагов, определяемых передаваемой маской.

Манипуляторы setiosflags() и resetiosflags() дают возможность соответственно установить или сбросить один или несколько флагов в командах записи или чтения с использованием оператора << или >>.

#include <iostream>

 

#include <iomanip>

 

. . .

 

std::cout << resetiosflags(std::ios::adjustfield) ;

// Сброс

выравнивания

 

std::cout << setiosflags(std::ios::left) ;

// Левое

выравнивание

 

6

Форматированный ввод-вывод логических

Флаг boolalpha определяет формат ввода и вывода логических значений – числовой или текстовый. Если флаг не установлен (значение по умолчанию), логические данные представляются в числовом виде. В этом случае false всегда представляется значением О, а true -значением 1. При чтении логических данных в числовом представлении наличие символов, отличных от О и 1, считается ошибкой (для потока данных устанавливается бит failbit).

При установке флага логические данные читаются и записываются в тексто-вом представлении. При чтении логического значения строка должна соответ-ствовать текстовому представлению true или false.

Строки, представляющие эти значения, определяются состоянием объекта локального контекста.

Стандартный объект локального контекста "С" использует для представления

логических значений строки "true" и "false". Для удобства работы с этим флагом определены специальные манипуляторы:

boolalpha Включает текстовое представление (установка флага ios::boolalpha)

noboolalpha Включает числовое представление (сброс флага ios::boolalpha)

Следующий фрагмент выводит переменную b сначала в числовом, а затем в

7

Ширина поля

Функци

Описание

я

 

Возвращает текущую ширину поля

width()

width(va

Задает ширину поля равной val и возвращает предыдущую

l)

 

ширину поля

 

Определение

форматированному полю. При вызове без аргументов width() возвращает текущую ширину поля. При вызове с целочисленным аргументом функция width() изменяет ширину поля и возвращает ее предыдущее значение.

Ширина поля не может использоваться для сокращения вывода. То есть максимальную ширину поля задать невозможно. Вместо этого ее придется самостоятельно запрограммировать, например, записав данные в строку и ограничив вывод определенным количеством символов.

По умолчанию минимальная ширина равна 0; это означает, что размер поля может быть произвольным.

После выполнения любой операции форматированного ввода-

8

 

Заполнитель

Функци

Описание

я

Возвращает текущий заполнитель

fill()

fill(с)

Назначает новый и возвращает предыдущий заполнитель

Функция fill() определяет символ, используемый для заполнения промежутков между отформатированным представлением величины и позицией, отмечающей минимальную ширину поля.

По умолчанию заполнителем является пробел.

Заполнитель остается без изменений до тех пор, пока он не будет модифицирован явно.

9

Выравнивание

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

Маска

Флаг

Описание

adjustfiel

left

Выравнивание по левому краю

d

right

Выравнивание по правому краю

 

 

intern

Выравнивание знака по левому краю, а значения -

 

al

по правому

Заполнитель остается без изменений до тех пор, пока он не будет модифицирован явно.

Заполнитель – знак подчеркивания, ширина поля - 6

 

-53

0.12

sss

left

-53___

0.12___

sss___

right

___-53

___0.12

___sss

internal

-___53

___0.12

___sss

10

Манипуляторы ширины, заполнения и

выравнивания

Манипулят

Описание

ор

Устанавливает ширину поля при вводе и выводе равной

setw(val)

setfill(c)

val (соответствует функции width())

Назначает заполнителем символ с (соответствует

left

функции fill())

Устанавливает выравнивание по левому краю

right

Устанавливает выравнивание по правому краю

internal

Устанавливает выравнивание знака по левому краю, а

значения - по правому

Манипуляторам setw() и setfill() должен передаваться аргумент, поэтому для их использования в программу необходимо включить заголовочный файл <iomanip>.