Setiosflags c что это
Манипуляторы потоков и флаги состояния формата в C++
Педагогические науки
Похожие материалы
Каждый поток, как и всякий объект, в любой момент времени характеризуется состоянием, определяющим свойства потока. Состояние описывается набором трех групп параметров:
Форматирование представляет собой преобразование последовательности байт потока в соответствии с установленными правилами. Так, при выводе в поток форматирование позволяет получать данные в определенном виде. При вводе форматирование позволяет считывать последовательность байт из потока как значение определенного типа. Флаги и переменные форматирования позволяют задать установленные в потоке правила форматирования, действующие при выполнении операций >.
Класс ostream наследован от класса basic_ios, который, в свою очередь, наследуется от ios_base. Класс ios_base хранит информацию, описывающую состояние формата. Управлять флагами и устанавливать значения переменных форматирования можно или на основе методов класса ios, или с помощью специальных функций – манипуляторов. Так, используя функции-члены ios_base, можно управлять шириной поля, основанием чисел для отображения целых, количеством знаков после запятой, и другими форматами 1.
Манипуляторы потоков используются в C++ при решении вопросов, связанных с форматированным вводом-выводом (например, задание точности, ширины полей, пропуск символов-разделителей во входном потоке, и т.д.) и находятся в пространстве имен std. Использование в программе параметризованных манипуляторов потока возможно только после включения заголовочного файла iomanip; непараметризованные манипуляторы потоков могут использоваться и без iomanip (например, endl, dec, oct, hex). Ниже в таблице 1 приведены краткие сведения по использованию некоторых манипуляторов потоков.
Функции
get_money
Извлекает денежное значение из потока, используя указанный формат, и возвращает значение в параметре.
Параметры
amount
Извлеченное денежное значение.
Примечания
get_time
Извлекает значение времени из потока, используя указанный формат. Возвращает значение в параметре в виде структуры времени.
Параметры
time_ptr
Время в виде структуры времени.
time_format
Формат, используемый для получения значения времени.
Комментарии
Пример
put_money
Вставляет денежную сумму, используя указанный формат, в поток.
Параметры
amount
Денежная сумма для вставки в поток.
Возвращаемое значение
Комментарии
put_time
Записывает значение времени из структуры времени в поток с использованием указанного формата.
Параметры
time_ptr
Значение времени для записи в поток в виде структуры времени.
time_format
Формат для записи значения времени.
Комментарии
quoted
(Новое в c++ 14) Манипулятор, обеспечивающий удобный цикл обработки строк в потоках и из них с помощью >> операторов и.
Параметры
delimiter
Указанный пользователем символ или двухбайтовый символ для использования в качестве разделителя для начала и конца строки.
escape
Указанный пользователем символ или двухбайтовый символ для использования в качестве escape-символа для escape-последовательностей в строке.
Комментарии
Примеры
В этом примере показано, как использовать quoted с разделителем по умолчанию и escape-символ с помощью узких строк. Широкие строки также поддерживаются.
В следующем примере показано, как предоставить настраиваемый разделитель или escape-символ:
resetiosflags
Удаляет указанные флаги.
Параметры
mask
Флажки, которые нужно очистить.
Возвращаемое значение
Пример
setbase
Задает основание целых чисел.
Параметры
base
Основание числа.
Возвращаемое значение
Пример
setfill
Задает символ, который будет использоваться для заполнения пробелов на экране с выравниванием по правому краю.
Параметры
Ch
Задает символ, который будет использоваться для заполнения пробелов при показе с выравниванием по правому краю.
Возвращаемое значение
Пример
setiosflags
Задает указанные флаги.
Параметры
mask
Флажки, которые нужно установить.
Возвращаемое значение
Пример
setprecision
Задает точность для значений с плавающей запятой.
Параметры
Prec
Точность для значений с плавающей запятой.
Возвращаемое значение
Пример
Ширина поля отображения для следующего элемента в потоке.
Параметры
Wide
Ширина поля отображения.
Возвращаемое значение
Комментарии
setw устанавливает ширину только для следующего элемента в потоке и должна быть вставлена перед каждым элементом, ширину которого нужно указать.
Использование операторов вставки и управление форматом
В этой статье описывается, как управлять форматом и как создавать операторы вставки для собственных классов. Оператор вставки ( ), который изначально включен во все стандартные типы данных C++, отправляет байты в объект потока вывода. Операторы вставки работают с предопределенными «манипуляторами» — элементами, которые изменяют формат целочисленных аргументов, заданный по умолчанию.
Форматом можно управлять с помощью следующих параметров:
Ширина выходных данных
Чтобы выстроить выходные данные, необходимо указать ширину выходных данных для каждого элемента, поместив setw манипулятор в поток или вызвав width функцию члена. В этом примере выравниваются по правому краю значения в столбце шириной по крайней мере 10 символов:
Начальные пробелы добавляются в любое значение шириной менее 10 символов.
Чтобы заполнить поле, используйте функцию- fill член, которая задает значение символа заполнения для полей с заданной шириной. По умолчанию используется пробел. Чтобы заполнить столбец цифр звездочками, измените предыдущий for цикл следующим образом:
Манипулятор endl заменяет символ перевода строки ( ‘\n’ ). Выходные данные выглядят следующим образом.
Чтобы указать ширину элементов выходных данных в той же строке, используйте манипулятор setw :
setw и width не усекаются значения. Если форматированные выходные данные превышают ширину, значения выводятся полностью в соответствии с заданной в потоке точностью. setw И width влияют только на следующее поле. Для ширины поля восстанавливается значение по умолчанию (необходимая ширина) после вывода одного поля. Другие параметры форматирования потока остаются в силе, пока не будут изменены.
Выравнивание
По умолчанию выравнивание текста в потоках вывода задано по правому краю. Чтобы выровняйте имена по левому краю в предыдущем примере и выровняйте числа по правому краю, замените for цикл следующим образом:
Выходные данные выглядят следующим образом.
Точность
Программа выведет этот список:
Чтобы исключить экспоненциальное представление, вставьте эту инструкцию перед for циклом:
С фиксированной нотацией программа выводит числа с одной цифрой после десятичной запятой.
При изменении ios::fixed флага на ios::scientific выводится следующее:
Основание системы счисления
dec oct Манипуляторы, и hex устанавливают основание системы счисления по умолчанию для входных и выходных данных. Например, при вставке hex манипулятора в поток вывода объект правильно преобразует внутреннее представление целых чисел в шестнадцатеричный формат выходных данных. Числа отображаются с цифрами от a до f в нижнем регистре, если uppercase флаг является четким (по умолчанию); в противном случае они отображаются в верхнем регистре. Основание системы счисления по умолчанию — dec (десятичное число).
Строки в кавычках (C++ 14)
При вставке строки в поток можно легко получить ту же строку обратно, вызвав stringstream::str() функцию-член. Однако если вы хотите использовать оператор извлечения для вставки потока в новую строку позже, возможно, вы получите непредвиденный результат, так как >> оператор по умолчанию будет останавливаться при обнаружении первого символа пробела.
Обработка пробелов операциями вставки и извлечения не зависит от способа представления строки в коде, поэтому заключение оператора в кавычки будет полезно в любом случае, независимо от того, является входная строка необработанным строковым литералом или обычной строкой. Входная строка любого формата может содержать внедренные кавычки, разрывы строк, табуляции и т. д., и все они будут сохранены quoted() манипулятором.
Setiosflags c что это
Начиная с этого шага, мы останоимся на форматных флагах, а аспекты форматирования, относящиеся к интернационализации программ, будут описаны позднее.
Форматные флаги
Класс ios_base содержит ряд переменных, предназначенных для определения форматов ввода-вывода. В частности, эти переменные определяют минимальную ширину поля, точность вывода вещественных чисел и заполнитель. Переменная типа ios::fmtflags содержит флаги конфигурации, которые определяют, нужно ли выводить знак перед положительными числами, должны ли логические значения выводиться в числовом или в символьном виде, и т. д.
Некоторые форматные флаги составляют группы. Например, признаки восьмеричного, десятичного и шестнадцатеричного форматов целых чисел входят в группу. Определены специальные маски, упрощающие работу с группами.
В таблице 1 перечислены функции, предназначенные для работы со всеми определениями форматов для потоков данных.
Функция | Описание |
---|---|
setf(флаги) | Устанавливает флаги, переданные в аргументе, в качестве дополнительных форматных флагов и возвращает предыдущее состояние всех флагов |
setf(флаги, маска) | Устанавливает флаги, переданные в первом аргументе, в качестве новых форматных флагов для группы, которая идентифицируется маской, переданной во втором аргументе, и возвращает предыдущее состояние всех флагов |
unsetf(флаги) | Сбрасывает флаги, переданные в аргументе |
flags() | Возвращает весь набор форматных флагов |
flags(флаги) | Устанавливает флаги, переданные в аргументе, в качестве новых форматных флагов и возвращает предыдущее состояние всех флагов |
сору(поток) | Копирует все определения форматов из потока, переданного в аргументе |
Функция flags() позволяет работать со всеми форматными флагами сразу. Вызов flags() без аргумента возвращает текущие форматные флаги. При вызове flags() с передачей аргумента этот аргумент интерпретируется как новое состояние всех форматных флагов, а функция возвращает старое состояние. Следовательно, при вызове flags() с аргументом все флаги сбрасываются, а устанавливаются только переданные флаги. Например, при помощи функции flags() можно сохранить текущее состояние флагов для последующего восстановления. В следующем фрагменте показано, как это делается:
Функция copyfmt() позволяет скопировать состояние форматных флагов из одного потока данных в другой. Установка и сброс форматных флагов могут производиться при помощи манипуляторов, представленных в таблице 2.
Манипулятор | Описание |
---|---|
setiosflags(флаги) | Устанавливает форматные флаги, переданные в аргументе, путем вызова функции setf(флаги) для потока данных |
resetiosflags(маска) | Сбрасывает все флаги группы, определяемой значением маски, путем вызова функции setf(0, маска) для потока данных |
Некоторые операции с флагами выполняются при помощи специализированных манипуляторов. Благодаря своему удобству и наглядности эти манипуляторы используются достаточно часто. Они будут рассмотрены позднее.
Setiosflags c что это
| Регистрация Доброго времени суток! Вроде иду по чуть-чуть, но с толком. Подробно разбираю все примеры и функции, но вот у меня появился вопрос, ответ на который я гуглил, но так и не нагуглил. Вот целая программа: В завершающем этапе есть две строки: Именно они и вызвали у меня сложности и ответы я не нашел. Первая строка как я понял говорит о том, что average будет иметь не только целые, но и запятые (об этом говорит float). Вторая строка для меня мрак. Что такое setprecission и setiosflags(ios::fixed | ios::showpoint) я вообще без понятий. Помогите пожалуйста, если не тяжело. Заранее благодарен! На сколько я понял, 2-я строка и функции, которые мне в ней не понятны, говорят о кол-ве символов после запятой и какие-то функции связанные с плавающей запятой. Лично я как-то так понял.
|