Spec-Zone.ru › C++

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

Определено в заголовочном файле <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 - список переменных аргументов, содержащий данные для вывода.


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

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

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

  • если P > X ≥ −4, преобразование выполняется со стилем f или F и точностью P − 1 − X.
  • в противном случае, преобразование выполняется со стилем e или E и точностью P − 1.

За исключением случаев запроса альтернативного представления, хвостовые нули удаляются, а также десятичная точка, если дробной части не осталось. Для бесконечности и нечисловых значений см. примечания.

Спецификатор
преобразования
Описание Ожидаемый
тип аргумента
Модификатор
длины
→
hh

(C++11)

h (нет) l ll

(C++11)

j

(C++11)

z

(C++11)

t

(C++11)

L
% Выводит литерал %. Полная спецификация преобразования должна быть %%. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c Выводит одиночный символ. Аргумент сначала преобразуется в wchar_t как если бы был вызван btowc. Если используется модификатор l, аргумент wint_t сначала преобразуется в wchar_t. Н/Д Н/Д
int
wint_t
Н/Д Н/Д Н/Д Н/Д Н/Д
s Выводит строку символов.

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

Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
d
i
Преобразует целое число со знаком в десятичное представление [-]dddd. Точность определяет минимальное количество цифр. По умолчанию точность равна 1.

Если преобразованное значение и точность равны ​0​, результат преобразования не содержит символов.

signed char
short
int
long
long long
intmax_t
целое со знаком size_t
ptrdiff_t
Н/Д
o Преобразует целое число без знака в восьмеричное представление oooo. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны ​0​, результат преобразования не содержит символов. В альтернативной реализации точность увеличивается при необходимости, чтобы вывести ведущий ноль. В этом случае, если преобразованное значение и точность равны ​0​, выводится одиночный ​0​.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
беззнаковое ptrdiff_t
Н/Д
x
X
Преобразует целое число без знака в шестнадцатеричное представление hhhh. Для x преобразования используются символы abcdef. Для X преобразования используются символы ABCDEF. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны ​0​, результат преобразования не содержит символов. В альтернативной реализации 0x или 0X добавляется в результат, если преобразованное значение отлично от нуля. Н/Д
u Преобразует целое число без знака в десятичное представление dddd. Точность определяет минимальное количество цифр. По умолчанию точность равна 1. Если преобразованное значение и точность равны ​0​, результат преобразования не содержит символов. Н/Д
f
F
Преобразует число с плавающей точкой в десятичную нотацию в стиле [-]ddd.ddd. Точность определяет точное количество цифр после десятичной точки. По умолчанию точность равна 6. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. Н/Д Н/Д
double
double(C++11)
Н/Д Н/Д Н/Д
long double
e
E
Преобразует число с плавающей точкой в экспоненциальную запись. Для e стиля преобразования используется [-]d.ddde±dd. Для E стиля преобразования используется [-]d.dddE±dd. Экспонента содержит по крайней мере две цифры, больше цифр используются только если необходимо. Если значение равно ​0​, экспонента также равна ​0​. Точность определяет точное количество цифр после десятичной точки. По умолчанию точность равна 6. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. Н/Д Н/Д Н/Д Н/Д Н/Д
a
A

(C++11)

Преобразует число с плавающей точкой в шестнадцатеричную экспоненциальную запись. Для a стиля преобразования используется [-]0xh.hhhp±d. Для A стиля преобразования используется [-]0Xh.hhhP±d. Первая шестнадцатеричная цифра не 0 если аргумент - нормализованное число с плавающей точкой. Если значение равно ​0​, экспонента также равна ​0​. Точность определяет точное количество цифр после шестнадцатеричной точки. По умолчанию точность достаточна для точного представления значения. В альтернативной реализации десятичная точка выводится даже если за ней нет цифр. Для бесконечности и нечисловых значений см. примечания. Н/Д Н/Д Н/Д Н/Д Н/Д
g
G
Преобразует число с плавающей точкой в десятичную или экспоненциальную запись в зависимости от значения и точности. Для g стиля преобразования выполняется преобразование со стилем e или f. Для G стиля преобразования выполняется преобразование со стилем E или F. Пусть P равно точности, если она отлична от нуля, 6 если точность не указана, или 1 если точность ​0​. Затем, если преобразование со стилем E имело бы экспоненту X: Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
n Возвращает количество символов, записанных до сих пор этим вызовом функции.

Результат записывается в значение, на которое указывает аргумент. Спецификация не может содержать ни флаги, ни ширину поля, ни точность.



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

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

Не-число преобразуется в nan или nan(char_sequence). Какой из них используется, определяется реализацией.

Преобразования F, E, G, A выдают INF, INFINITY, NAN соответственно.

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

Правильные спецификации преобразования для типов символов фиксированной ширины (int8_t, и т.д.) определены в заголовке <cinttypes> (хотя PRIdMAX, PRIuMAX, и т.д. являются синонимами %jd, %ju, и т.д.).

Спецификатор преобразования для записи в память %n является распространённой целью эксплойтов, где строки форматирования зависят от пользовательского ввода, и не поддерживается семейством функций printf_s с проверкой границ.

После действия каждого спецификатора преобразования имеется точка последовательности; это позволяет хранить несколько %n результатов в одной переменной или, как крайний случай, выводить строку, изменённую более ранним %n в том же вызове.

Если спецификатор преобразования некорректен, поведение не определено.

Значение результата

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

Примечания

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

Пример

См. также

vprintfvfprintfvsprintfvsnprintf
(C++11)
выводит отформатированный вывод в stdout, потоке файла или буфере
используя переменную аргументную цепочку
(функция)
wprintffwprintfswprintf
выводит отформатированный вывод широких символов в stdout, поток файла или буфер
(функция)
C документация для vwprintf, vfwprintf, vswprintf

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/vfwprintf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API