Форматирование данных при обмене с потоками


Непосредственное применение операций помещения (извлечения) к стандартным потокам cout, cin, cerr, clog для данных базовых типов приводит к использованию «умалчиваемых» форматов внешнего представления пересылаемых значений. Например, при выводе чисел каждое из них занимает столько позиций, сколько необходимо для его представления. Это не всегда удобно. Форматы представления выводимой информации и правила восприятия данных, вводимых из потока, программистом могут быть изменены. Библиотека потоков C++ предусматривает три способа управления форматом данных: использование флагов форматирования, вызов компонентных функций потока и применение манипуляторов. Все эти средства определены для базового потокового класса ios и наследуются всеми потоками библиотеки. Рассмотрим каждый из этих методов.

Флаги форматирования определяют данные перечислительного типа в поле x-flags класса ios:

enum { // флаги форматирования

skipws = 0x0001, // пропуск ведущих пробелов

left = 0x0002, // выравнивание влево

right = 0x0004, // выравнивание вправо

internal = 0x0008, // заполнение после знака

dec = 0x0010, // десятичное преобразование

oct = 0x0020, // восьмеричное преобразование

hex = 0x0040, // шестнадцатеричное преобраз.

showbase = 0x0080, // выводить признак сист. счисл.

showpoint = 0x0100, // выводить десятичную точку

uppercase = 0x0200, // верхний регистр 16-ных чисел

showpos = 0x0400, // выводить знак ‘+’

scientific = 0x0800, // нотация с плавающей точкой

fixed = 0x1000, // нотация с фиксирован, точкой

unitbuf = 0x2000, // очищать поток при помещении

stdio = 0x4000 // очищать потоки stdout, stderr

Кроме того, в классе ios определены следующие статические константы:

static const long basefield=( dec | oct | hex);

static const long adjusttield=( left | right | internal);

static const long floatfield=(scientific | fixed);

Флаги реализованы в виде отдельных фиксированных битов чисел типа long, поэтому несколько флагов с помощью логических битовых выражений можно объединять, тем самым по-разному комбинируя свойства потока. Ниже перечислим флаги, которые реализуют основные свойства потока:

· skipws: операция извлечения из потока игнорирует ведущие пробелы и эквивалентные им символы (знаки табуляции \t’ и ‘\v’, символы перевода строки ‘\n’, возврата каретки ‘\r’ и перевода страницы ‘\f’); данный флаг установлен по умолчанию;

· left:данные при помещении в поток выравниваются по левой границе поля вывода;

· right:данные при помещении в поток выравниваются по правой границе (по умолчанию);

· internal: знак числа (либо признак основания системы счисления — см. флаг showbase) выводится с левого края поля, а число выравнивается по правому краю, промежуток заполняется символами-заполнителями (по умолчанию — пробел, см. ниже компонент ios::x_fill);

· dec:числа выводятся в десятичной системе счисления (флаг установлен по умолчанию);

· oct: числа выводятся в восьмеричной системе счисления;

· hex: числа выводятся в шестнадцатеричной системе счисления;

· showbase: при выводе чисел добавляется признак основания системы счисления (0х для шестнадцатеричных чисел, 0 — для восьмеричных);

· showpoint: при выводе вещественных чисел обязательно показывать десятичную точку и следующие за ней нули (даже для чисел с нулевой дробной частью);

· uppercase:при выводе чисел используются буквы верхнего регистра (символ х и буквы abcdef для шестнадцатеричных цифр), указатель порядка Е — для чисел с плавающей точкой;

· showpos: для положительных значений выводится знак числа (символ +);

· scientific: для вещественных чисел используется представление в формате с плавающей десятичной точкой (научная нотация), т.е. с указанием порядка и мантиссы, имеющей одну ненулевую (значащую) цифру перед точкой (например, 1.2345е2);

· fixed: для вещественных чисел используется представление в формате с фиксированной десятичной точкой, причем количество цифр дробной части определяется заданной по умолчанию точностью;

· unitbuf: поток очищается (выгружается содержимое буфера) после каждой операции помещения.

Среди флагов форматирования можно выделить три битовых поля, каждое из которых объединяет исключающие друг друга флаги (в каждый момент времени может быть установлен только один из них):

· поле основания системы счисления, состоящее из флагов dec, oct и hex;

· поле способа выравнивания — left, right и internal;

· поле нотации вещественных чисел — scientific и fixed.

Класс ios дает имена этим полям, описывая три статические константы как дизъюнкции соответствующих флагов — basefield, adjustfield и floatfield. Поскольку константы, а также перечисленные имена флагов описаны внутри класса ios, то обращение к ним требует применения операции разрешения видимости, например, ios::basefield, ios::skipws.

Установку необходимых флагов ввода-вывода обеспечивают компонентные методы:

· long flags() возвращает текущие флаги форматирования потока;

· long flags(long) присваивает флагам значение, сообщаемое параметром, и возвращает прежнее значение флагов;

· long setf(long, long) присваивает флагам, биты которых установлены во втором параметре, значения соответствующих битов первого параметра и возвращает прежнее значение всех флагов (в качестве второго параметра удобно использовать имена полей basefield, adjustfield и floatfield);

· long setf(long) устанавливает флаги, биты которых установлены в параметре, и возвращает прежнее значение всех флагов;

· long unsetf(long) сбрасывает флаги, биты которых установлены в параметре, и возвращает прежнее значение всех флагов.



Дата добавления: 2021-07-22; просмотров: 365;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.