Std setw c что это
Использование операторов вставки и управление форматом
В этой статье описывается, как управлять форматом и как создавать операторы вставки для собственных классов. Оператор вставки ( ), который изначально включен во все стандартные типы данных 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() манипулятором.
Функции
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 устанавливает ширину только для следующего элемента в потоке и должна быть вставлена перед каждым элементом, ширину которого нужно указать.
Как std :: setw работает со строковым выводом?
Я пытаюсь использовать заданную ширину setw однако для вывода строки в выходной файл я не могу заставить его работать. У меня есть со мной следующий пример.
Я почти не вижу пробелов, выход просто приходит как firstsecond
Я думаю, что я пропустил работу setw()
Замечания: Для целых чисел, это прекрасно работает просто:
Решение
Я подозреваю ваше понимание std::setw это просто не правильно. Я думаю, что вам нужно что-то еще в сочетании комбинации:
Что происходит в вашем коде:
Если вы намереваетесь иметь что-то вроде этого (с номерами столбцов выше, чтобы показать позиции):
Обратите внимание, как каждое слово начинается с четного кратного 10 границ. Один из способов сделать это с помощью:
пример
Выход (добавлены номера столбцов)
Наконец, один конструктивный способ увидеть, где применяются символы заполнения, — это просто изменить символ заполнения на что-то видимое (то есть что-то кроме пробела). Последние два примера выводят, изменяя заполняющий символ на std::setfill(‘*’) производит следующий вывод:
Обратите внимание, что в обоих случаях ни один из отдельных выходных элементов не нарушил std::setw значение, Всего Размер выходной линии для каждого одинаков. Все, что изменилось, было то, где были применены заливки и выровнены результаты в пределах std::setw Спецификация.
Урок №209. Функционал классов ostream и ios. Форматирование вывода
Обновл. 15 Сен 2021 |
На этом уроке мы рассмотрим функционал классов ostream и ios в языке С++.
Форматирование вывода
Есть два способа управления параметрами форматирования вывода:
флаги — это логические переменные, которые можно включить/выключить;
манипуляторы — это объекты, которые помещаются в поток и влияют на способ ввода/вывода данных.
Для включения флага используйте функцию setf() с соответствующим флагом в качестве параметра. Например, по умолчанию C++ не выводит знак + перед положительными числами. Однако, используя флаг std::showpos, мы можем это изменить:
Также можно включить сразу несколько флагов, используя побитовый оператор ИЛИ ( | ):
Чтобы отключить флаг, используйте функцию unsetf():
Многие флаги принадлежат к определенным группам форматирования. Группа форматирования — это группа флагов, которые задают аналогичные (иногда взаимоисключающие) параметры форматирования вывода. Например, есть группа форматирования basefield.
Флаги группы форматирования basefield:
oct (от англ. «octal» = «восьмеричный») — восьмеричная система счисления;
dec (от англ. «decimal» = «десятичный») — десятичная система счисления;
hex (от англ. «hexadecimal» = «шестнадцатеричный») — шестнадцатеричная система счисления.
Эти флаги управляют выводом целочисленных значений. По умолчанию установлен флаг std::dec, т.е. значения выводятся в десятичной системе счисления. Попробуем сделать следующее:
Ничего не работает! Почему? Дело в том, что setf() только включает флаги, он не настолько умен, чтобы одновременно отключать другие (взаимоисключающие) флаги. Следовательно, когда мы включаем std::hex, std::dec также включен и у него приоритет выше. Есть два способа решения данной проблемы.
Во-первых, мы можем отключить std::dec, а затем включить std::hex:
Теперь уже результат тот, что нужно:
Второй способ — использовать вариацию функции setf(), которая принимает два параметра:
первый параметр — это флаг, который нужно включить/выключить;
второй параметр — группа форматирования, к которой принадлежит флаг.
При использовании этой вариации функции setf() все флаги, принадлежащие группе форматирования, отключаются, а включается только передаваемый флаг. Например:
Язык C++ также предоставляет еще один способ изменения параметров форматирования: манипуляторы. Фишка манипуляторов в том, что они достаточно умны, чтобы одновременно включать и выключать соответствующие флаги. Например:
В общем, использовать манипуляторы гораздо проще, нежели включать/выключать флаги. Многие параметры форматирования можно изменять как через флаги, так и через манипуляторы, но есть и такие параметры форматирования, которые изменить можно либо только через флаги, либо только через манипуляторы.
Полезные флаги, манипуляторы и методы
Флаг:
Манипуляторы:
1 0
true false
1 0
true false
Флаг:
Манипуляторы:
Флаг:
uppercase — если включен, то используются заглавные буквы.
Манипуляторы:
uppercase — используются заглавные буквы.
nouppercase — используются строчные буквы.
1.23457e+007
1.23457E+007
1.23457e+007
1.23457E+007
Флаги группы форматирования basefield:
dec — значения выводятся в десятичной системе счисления;
hex — значения выводятся в шестнадцатеричной системе счисления;
oct — значения выводятся в восьмеричной системе счисления.
Манипуляторы:
dec — значения выводятся в десятичной системе счисления;
hex — значения выводятся в шестнадцатеричной системе счисления;
oct — значения выводятся в восьмеричной системе счисления.
Теперь вы уже должны понимать связь между флагами и манипуляторами.
Точность, запись чисел и десятичная точка
Используя манипуляторы (или флаги), можно изменить точность и формат вывода значений типа с плавающей точкой.
Флаги группы форматирования floatfield:
fixed — используется десятичная запись чисел типа с плавающей точкой;
scientific — используется экспоненциальная запись чисел типа с плавающей точкой;
showpoint — всегда отображается десятичная точка и конечные нули для чисел типа с плавающей точкой.
Манипуляторы:
fixed — используется десятичная запись значений;
scientific — используется экспоненциальная запись значений;
showpoint — отображается десятичная точка и конечные нули чисел типа с плавающей точкой;
noshowpoint — не отображаются десятичная точка и конечные нули чисел типа с плавающей точкой;
setprecision(int) — задаем точность для чисел типа с плавающей точкой.
Методы:
precision() — возвращаем текущую точность для чисел типа с плавающей точкой;
precision(int) — задаем точность для чисел типа с плавающей точкой.
Если используется десятичная или экспоненциальная запись чисел, то точность определяет количество цифр после запятой/точки. Обратите внимание, если точность меньше количества значащих цифр, то число будет округлено. Например:
Урок №208. Функционал класса istream
Обновл. 15 Сен 2021 |
Оператор извлечения
Как вы уже узнали на предыдущем уроке, мы можем использовать оператор извлечения >> для считывания информации из входного потока. Одной из наиболее распространенных проблем при считывании строк из входного потока является предотвращение переполнения. Например:
Что произойдет, если пользователь введет 20 символов? Правильно, переполнение. Одним из способов решения этой проблемы является использование манипуляторов. Манипулятор — это объект, который применяется для изменения потока данных с использованием операторов извлечения ( >> ) или вставки ( ).
Мы уже работали с одним из манипуляторов — endl, который одновременно выводит символ новой строки и удаляет текущие данные из буфера. Язык C++ предоставляет еще один манипулятор — setw() (из заголовочного файла iomanip), который используется для ограничения количества символов, считываемых из потока. Для использования setw() вам нужно просто передать в качестве параметра максимальное количество символов для извлечения и вставить вызов этого манипулятора следующим образом:
Эта программа теперь прочитает только первые 11 символов из входного потока (+ один символ для нуль-терминатора). Все остальные символы останутся в потоке до следующего извлечения.
Извлечение и пробелы
Важный момент: оператор извлечения работает с «отформатированными» данными, т.е. он игнорирует все пробелы, символы табуляции и символ новой строки. Например:
Если пользователь введет следующее:
Hello! My name is Anton
То оператор извлечения пропустит все пробелы и символы новой строки. Следовательно, результат выполнения программы:
Часто пользовательский ввод все же нужен со всеми его пробелами. Для этого класс istream предоставляет множество функций. Одной из наиболее полезных является фунция get(), которая извлекает символ из входного потока. Вот вышеприведенная программа, но уже с использованием функции get():
Теперь, если мы введем следующее:
Hello! My name is Anton
Hello! My name is Anton
Функция get() также имеет строковую версию, в которой можно указать максимальное количество символов для извлечения. Например:
Если мы введем следующее:
Hello! My name is Anton
Обратите внимание, программа считывает только первые 11 символов (+ нуль-терминатор). Остальные символы остаются во входном потоке.
Один важный нюанс: функция get() не считывает символ новой строки! Например:
Если пользователь введет следующее:
И программа сразу же завершит свое выполнение! Почему так? Почему не срабатывает второй ввод данных? Дело в том, что первый get() считывает символы до символа новой строки, а затем останавливается. Второй get() видит, что во входном потоке все еще есть данные и пытается их извлечь. Но первый символ, на который он натыкается — символ новой строки, поэтому происходит второй «Стоп!».
Для решения данной проблемы класс istream предоставляет функцию getline(), которая работает точно так же, как и функция get(), но при этом может считывать символы новой строки:
Этот код работает точно так, как ожидается, даже если пользователь введет строку с символом новой строки.
Если вам нужно узнать количество символов, извлеченных последним getline(), используйте функцию gcount():
Hello! My name is Anton
24 characters were read
Специальная версия функции getline() для std::string
Еще несколько полезных функций класса istream
функция ignore() — игнорирует первый символ из потока;
функция ignore(int nCount) — игнорирует первые nCount (количество) символов из потока;
функция peek() — считывает символ из потока, при этом не удаляя его из потока;
функция unget() — возвращает последний считанный символ обратно в поток, чтобы его можно было извлечь в следующий раз;
функция putback(char ch) — помещает выбранный вами символ обратно в поток, чтобы его можно было извлечь в следующий раз.
Класс istream содержит еще множество других полезный функций и их вариаций, но это уже тема для отдельного туториала.
Поделиться в социальных сетях: