Пространства имён
Варианты
Действия

std::vwprintf, std::vfwprintf, std::vswprintf

Материал из cppreference.com
< cpp‎ | io‎ | c
 
 
Библиотека ввода/вывода
Манипуляторы ввода/вывода
Функции print (C++23)
Ввод/вывод в стиле C
Буферы
(устарело в C++98)
Потоки
Абстракции
Файловый ввод/вывод
Ввод/вывод строк
Ввод/вывод массивов
(устарело в C++98)
(устарело в C++98)
(устарело в C++98)
Синхронизированный вывод
Типы
Интерфейс категорий ошибок
(C++11)
 
Ввод/Вывод в стиле C
Типы и объекты
Функции
Доступ к файлам
Прямой ввод/вывод
Неформатированный ввод/вывод
Форматированный ввод
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
Форматированный вывод
vwprintfvfwprintfvswprintf
Позиционирование файла
Обработка ошибок
Операции с файлами
 
Определено в заголовочном файле <cwchar>
int vwprintf( const wchar_t* format, va_list vlist );
(1)
int vfwprintf( std::FILE* stream, const wchar_t* format, va_list vlist );
(2)
int vswprintf( wchar_t* buffer, std::size_t buf_size, const wchar_t* format, va_list vlist );
(3)

Загружает данные из мест, определённых vlist, преобразует их в эквивалентные широкие строки и записывает результаты в различные приёмники.

1) Записывает результаты в stdout.
2) Записывает результаты в файловый поток stream.
3) Записывает результаты в широкую строку buffer. Записывается не более size-1 широких символов, за которыми следует нулевой широкий символ.

Содержание

[править] Параметры

stream выходной широкий поток для записи
buffer указатель на широкую строку для записи
buf_size максимальное количество широких символов для записи
format указатель на широкую строку с нулевым завершающим символом, определяющую, как интерпретировать данные
vlist список переменных аргументов, содержащий данные для вывода


Строка форматирования состоит из печатных и пробельных символов (кроме %), без изменения выводимых в выходной поток, и спецификаторов форматирования. Структура спецификатора:

  • символ-маркер %
  • (необязательно) один или несколько флагов, которые изменяют поведение форматирования:
  • -: выравнивание по левому краю внутри поля заданной ширины (по умолчанию по правому краю)
  • +: принудительная печать знака + с положительными значениями (по умолчанию знаком дополняются только отрицательные значения)
  • пробел: не дополненные знаком или отсутствующие численные значения дополняются слева пробелом. Игнорируется, если присутствует флаг +.
  • #: выполнится альтернативное форматирование. См. таблицу ниже для подробностей: если альтернативное форматирование не определено, поведение не определено (UB).
  • 0: при печати чисел в поле заданной ширины заполнение пустоты идёт нулями вместо пробелов. Для целых чисел флаг игнорируется, если задано количество выводимых знаков (точность). При печати не чисел вызывает неопределённое поведение (UB). Флаг игнорируется, если присутствует флаг -.
  • (необязательно) целое число, означающее минимальную ширину поля, или *. Свободное пространство в поле по умолчанию заполняется пробелами, выравнивание по правому краю. При использовании * ширина поля задаётся дополнительным аргументом типа int. Отрицательное значение ширины эквивалентно применению дополнительно флага -.
    (Замечание: задаётся минимальная ширина поля, форматируемое значение никогда не обрезается.)
  • (необязательно) . с целым числом, * или просто .. Число определяет точность. При использовании * точность задаётся дополнительным аргументом типа int. Просто . устанавливает нулевую точность. См. таблицу ниже для подробностей о действии точности на вывод.
  • (необязательно)модификатор размера: определяет размер аргумента
  • спецификатор формата вывода

Доступны следующие спецификаторы формата:

Спецификатор Описание Флаг размера
hh h (нет) l ll j z t L
% выводит символ %. Полный спецификатор формата %%. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c
выводит символ

Аргумент сначала приводится к wchar_t, как при вызове btowc. Если использован флаг l, the wint_t argument is first converted to wchar_t.

Н/Д Н/Д
int
wint_t
Н/Д Н/Д Н/Д Н/Д Н/Д
s
выводит строку

Аргумент должен быть указателем на первый элемент массива символов, содержащих последовательность байт в мультибайтовой кодировке без сдвига. Конвертируется в массив wchar, как при вызове mbrtowc. Точность определяет максимальное количество выведенных символов типа wchar. Если точностьне задана, выводит всё до первого встреченного нулевого символа (не включая его). Если использован флаг l, аргумент должен быть указателем на первый элемент массива wchar_t.

Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
d
i
форматирует знаковое целое как десятичное число в виде [-][0-9]*

Точность определяет минимальное количество выводимых знаков. По умолчанию 1.
Если форматированное значение и точность являются 0, ничего не выводится.

signed char
short
int
long
long long
intmax_t
signed size_t
ptrdiff_t
Н/Д
o
форматирует беззнаковое целое как восьмеричное число в виде [0-7]*

Точность определяет минимальное количество выводимых знаков. По умолчанию 1.
Если форматированное значение и точность являются 0, ничего не выводится.
Альтернативная реализация: при необходимости точность повышается, чтобы добавить ноль слева. Таким образом, если форматированное значение и точность являются 0, выводится 0.

unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
unsigned version of ptrdiff_t
Н/Д
x
X
форматирует беззнаковое целое как шестнадцатеричное число в виде [0-F]*

Формат x использует буквы abcdef.
Формат X использует буквы ABCDEF.
Точность определяет минимальное количество выводимых знаков. По умолчанию 1.
Если форматированное значение и точность являются 0, ничего не выводится.
Альтернативная реализация: ненулевые значения выводятся с приставкой 0x или 0X соответственно.

Н/Д
u
форматирует беззнаковое целое как десятичное число в виде [0-9]*

Точность определяет минимальное количество выводимых знаков. По умолчанию 1.
Если форматированное значение и точность являются 0, ничего не выводится.

Н/Д
f
F
форматирует число с плавающей запятой в виде [-]d.d, где d - произвольные десятичные числа

Точность определяет минимальное количество выводимых знаков после запятой. По умолчанию 6.
Альтернативная реализация: выводит десятичную точку даже если число целое.
Форматирование бесконечности и NaN см. в примечаниях.

Н/Д Н/Д
double
double (начиная с C99)
Н/Д Н/Д Н/Д Н/Д
long double
e
E
форматирует число с плавающей запятой в экспоненициальной форме: AeB == A * pow (10, B)

Формат e использует букву e: AeB.
Формат E использует букву E: AEB.
Экспонента содержит не менее 2 цифр.
Точность определяет минимальное количество выводимых знаков после запятой. По умолчанию 6.
Альтернативная реализация: выводит десятичную точку даже если мантисса целая.
Форматирование бесконечности и NaN см. в примечаниях.

Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
a
A
форматирует число с плавающей запятой в шестнадцаеричной экспоненциальной форме

Формат a выводит [-]0xh.hhhp±d.
Формат A выводит [-]0Xh.hhhP±d.
Если число не нормализовано, первой цифрой выводится 0.
Если число 0, экпонента тоже 0.
Точность определяет минимальное количество выводимых знаков после запятой. По умолчанию выбирается значение, достаточное для полного вывода.
Альтернативная реализация: выводит десятичную точку даже если мантисса целая.
Форматирование бесконечности и NaN см. в примечаниях.

Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
g
G
форматирует число с плавающей запятой в десятичной или десятичной экспоненциальной форме в зависимости от значения и точности

Формат g выводит в формате e или f.
Формат G выводит в формате E или F.
Пусть P - параметр точности вывода. означает, что точность не задана, означает, что точность 0; в остальных случаях, если , точность равняется P. Если точность числа P, а экспонента при выводе в десятичном формате X, то:

  • Если P> X ≥ -4, используется формат f / F с точностью -1 - X.
  • Иначе используется формат e / E с точностью P - 1

Альтернативная реализация: выводит десятичную точку даже если мантисса целая; нули в конце не убираются.
Форматирование бесконечности и NaN см. в примечаниях.

Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
n
возвращает число символов, записанных данным вызовом функции к моменту %n.

Результат записывается в переменную, на которую указывает параметр. Данный спецификатор не допускает использования каких-либо флагов и модификаторов.

signed char*
short*
int*
long*
long long*
intmax_t*
size_t*
ptrdiff_t*
Н/Д
p
выводит указатель в зависящем от реализации виде.
Н/Д Н/Д void* Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д

Формат чисел с плавающей запятой выводит бесконечность как inf или infinity в зависимости от реализации.

NaN преобразуется в nan или nan(char_sequence) в зависимости от реализации. Форматы F, E, G, A выводят INF, INFINITY, NAN.

Несмотря на то, что %c принимает параметр типа int, передавать char безопасно из-за преобразования к int при разборе аргументов форматирования.

Корректные преобразования для типов фиксированного размера (int8_t и прочих) объявлены в <cinttypes>(C++) или<inttypes.h> (C) (вызов PRIdMAX, PRIuMAX, и прочих соответствует %jd, %ju и т.д.).

Записывающий спецификатор %n - типичная цель для атак в случаях, когда строка формата зависит от пользовательского ввода. Не поддерживается семейством функций printf_s.

Каждый спецификатор формата происводит вычисление своего аргумента в момент печати. Это позволяет вызывать %n несколько раз и выводить результат действия предыдущего вызова %n в этом же вызове функции.

Неправильный спецификатор формата вызывает неопределённое поведение (UB).

[править] Возвращаемое значение

1,2) Количество записанных широких символов в случае успеха или отрицательное значение в случае возникновения ошибки.
3) Количество записанных широких символов (не считая завершающего нулевого широкого символа) в случае успеха или отрицательное значение, если произошла ошибка кодирования или если количество генерируемых символов было равно или больше, чем size.

[править] Примечание

Хотя узкие строки предоставляют std::vsnprintf, которая позволяет определить требуемый размер выходного буфера, для широких строк нет эквивалента, и для определения размера буфера программе может потребоваться вызвать std::vswprintf, проверить значение результата и перераспределить больший буфер, повторяя попытки до достижения успеха.

[править] Пример

[править] Смотрите также

производит форматированный вывод в stdout, файловый поток или буфер

(функция) [править]
печатает вывод форматированных широких символов в stdout, файловый поток или буфер
(функция) [править]
Документация C по vwprintf, vfwprintf, vswprintf