Манипуляторы потоков и флаги состояния формата в C++
В статье рассматриваются вопросы, связанные с организацией форматированного ввода-вывода. Форматирование в языке программирования С+ реализуется посредством специальных функций – манипуляторов, а для задания видов форматирования используются флаги формата. В работе перечислены основные манипуляторы потоков и флаги состояния формата.
Ключевые слова
Текст научной работы
Каждый поток, как и всякий объект, в любой момент времени характеризуется состоянием, определяющим свойства потока. Состояние описывается набором трех групп параметров:
- флаги (признаков) состояния потоков и указателей, которые определяют связь одних потоков с другими;
- флаги и переменные форматирования, которые определяют поведение потока при форматированном вводе-выводе;
- переменная, хранящая текущую позицию потока и флаги режимов работы с устройствами (файлами).
Форматирование представляет собой преобразование последовательности байт потока в соответствии с установленными правилами. Так, при выводе в поток форматирование позволяет получать данные в определенном виде. При вводе форматирование позволяет считывать последовательность байт из потока как значение определенного типа. Флаги и переменные форматирования позволяют задать установленные в потоке правила форматирования, действующие при выполнении операций << и >>.
Класс ostream наследован от класса basic_ios, который, в свою очередь, наследуется от ios_base. Класс ios_base хранит информацию, описывающую состояние формата. Управлять флагами и устанавливать значения переменных форматирования можно или на основе методов класса ios, или с помощью специальных функций – манипуляторов. Так, используя функции-члены ios_base, можно управлять шириной поля, основанием чисел для отображения целых, количеством знаков после запятой, и другими форматами [1-3].
Манипуляторы потоков используются в C++ при решении вопросов, связанных с форматированным вводом-выводом (например, задание точности, ширины полей, пропуск символов-разделителей во входном потоке, и т.д.) и находятся в пространстве имен std. Использование в программе параметризованных манипуляторов потока возможно только после включения заголовочного файла iomanip; непараметризованные манипуляторы потоков могут использоваться и без iomanip (например, endl, dec, oct, hex). Ниже в таблице 1 приведены краткие сведения по использованию некоторых манипуляторов потоков.
Таблица 1. Манипуляторы потоков
Описание, пример использования
Установка ширины поля: cout<
Выходная величина Name будет напечатана с шириной поля 5, т.е. ее значение будет содержать, по крайней мере, 5 символьных позиций. Если длина выходной величины менее 5 символов, она будет выровнена в поле по правому символу; в противном случае размер поля будет увеличен, чтобы вместить всю величину.
Установка ширины поля: cout<
Если величина Name имеет меньше символов, чем заданная ширина поля 5, то для заполнения лишних позиций будут использованы заполняющие символы; в противном случае размер поля будет увеличен, чтобы вместить всю величину.
Для этих же целей можно использовать функцию-член width():
Метод width() касается только следующего отображаемого элемента, после чего ширина поля вернется к значению по умолчанию.
Позволяет управлять точностью печатаемых чисел с плавающей запятой (числом разрядов справа от десятичной точки): cout<ch;
Действует для всех последующих операций вывода, пока не будет произведена другая установка точности.
С тем же успехом можно использовать функцию-член precision():
Устанавливает десятичный формат представления данных (с основанием 10): cout<ch;
Устанавливает восьмеричный формат представления данных (с основанием 8): cout<ch;
Устанавливает шестнадцатеричный формат представления данных (с основанием 16): cout<ch;
Изменяет основание потока, принимая какой-либо из целых параметров 8, 10 или 16, задающих основание системы счисления: cout<ch;
Используется для установки флагов состояния форматов (то же, что и функция setf, см. ниже):
То же, что и функция unsetf (см. ниже).
Устанавливает значение заполняющего символа:
Для этой же цели можно использовать функцию-член fill(), которая позволяет задать заполняющий символ, использующийся при выравнивании в полях (по умолчанию используются пробелы) и возвращает предыдущий заполняющий символ:
В отличие от ширины поля, новый символ-заполнитель остается до тех пор, пока не будет заменен.
Так как манипуляторы не являются функциями-членами, то они не должны вызываться объектом. Отмечу, что, так как манипуляторы представляют собой функции, то их можно использовать, например, так:
Здесь вызов функции-манипулятора устанавливает шестнадцатеричный формат основания числа для потока cout.
Для задания видов форматирования используют флаги формата, которые определяются как перечислимый тип в классе ios_base. Установка флагов осуществляется функциями-членами setf(), unsetf() и flags() (однако во многих случаях удобнее использовать манипуляторы потоков). После установки флаг сохраняет свое состояние, пока не будет сброшен. Флаги состояния формата приведены в таблице 2.
При использовании компилятора Borland C++ 5.02 вместо класса ios_base необходимо указывать класс ios. Это связано с тем, что члены и методы класса ios_base раньше находились в классе ios. Сейчас класс ios_base выступает базовым классом для ios. В новой системе класс ios – шаблонный класс со спецификациями char и wchar_t, а ios_base содержит в себе не шаблонные средства.
Таблица 2. Флаги состояния формата
Флаг состояния формата
Позволяет выводить символическое представление true и false.
Выравнивание выходных данных по левому краю поля с добавлением необходимых символов-заполнителей справа.
Выравнивание выходных данных по правому краю поля с добавлением необходимых символов-заполнителей слева.
Показывает, что знак числа должен быть выровнен по левой границе поля, а значение числа – по правой границе. В промежуточные позиции размещаются заполняющие символы.
Показывает, что во входном потоке должны пропускаться символы-разделители (принимается как значение по умолчанию). Для сброса флага можно вызвать функцию unsetf(ios_base::skipws);
Устанавливается для вывода чисел с плавающей запятой в формате с фиксированной точкой и заданным количеством разрядов справа от десятичной точки (указанным с помощью функции-члена precision() или манипулятора setprecision):
Для восстановления формата вывода чисел (по умолчанию) с плавающей запятой, следует написать:
Устанавливается для вывода чисел с плавающей запятой в экспоненциальном формате.
Указывает, что положительным и отрицательным числам должны предшествовать знаки "плюс" и "минус" соответственно.
Указывает, что числа с плавающей запятой должны выводиться с десятичной точкой. Обычно используют совместно с флагом ios_base::fixed.
Указывает, что прописная буква "E" должна использоваться при представлении значения с плавающей запятой в экспоненциальном формате. Также предполагает использование прописных букв в шестнадцатеричном целом.
Устанавливает восьмеричный формат представления данных (с основанием 8).
Устанавливает десятичный формат представления данных (с основанием 10).
Устанавливает шестнадцатеричный формат представления данных (с основанием 16).
Указывает, что основание числа должно выводиться перед числом: для восьмеричных чисел выводится начальный символ "0", десятичные числа выводятся обычным способом, шестнадцатеричные числа выводятся с индикатором "0x" или "0X".
Обычно задается в качестве второго параметра функции-члена setf(), если устанавливаются флаги left, right или internal (это гарантирует, что функция setf() установит только один из трех флагов).
Позволяет задать очистку буфера после каждой операции вывода.
Допускается объединение разных флагов в одно значение (типа long) путем использования операции побитовое ИЛИ (|); можно также использовать операцию "запятая":
Текущие установки флагов формата могут быть сохранены в переменной типа long, и в дальнейшем их можно использовать для восстановления исходных установок форматов.
Функция-член unsetf() сбрасывает установленные флаги и возвращает их предыдущие значения. Функция-член flags() позволяет вернуть прежний набор установок.
Читайте также
- Хусаинов И.Г.
- Дмитриев В.Л.
- Алексеева К.В.
- Дмитриев В.Л.
- Суханов С.П.
- Дмитриев В.Л.
- Дмитриева С.Г.
- Суханов С.П.
- Дмитриев В.Л.
- Дмитриева С.Г.
- Суханов С.П.
Список литературы
- Прата С. Язык программирования С++. Лекции и упражнения, 5-е изд.: Пер. с англ. – М.: Вильямс, 2007. – 1184 с.
- Страуструп Б. Язык программирования С++. Специальное издание. – М.: Бином, 2004. – 1054 с.
- Stroustrup Bjarne. The C++ programming language / Bjarne Stroustrup. – Fourth edition. – Boston: Addison-Wesley, 2013. – 1368 p.
Цитировать
Дмитриев, В.Л. Манипуляторы потоков и флаги состояния формата в C++ / В.Л. Дмитриев. — Текст : электронный // NovaInfo, 2016. — № 57. — С. 339-343. — URL: https://novainfo.ru/article/10114 (дата обращения: 26.06.2022).
Поделиться
Электронное периодическое издание зарегистрировано в Федеральной службе по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор), свидетельство о регистрации СМИ — ЭЛ № ФС77-41429 от 23.07.2010 г.