Spec-Zone.ru › C++

std::wprintf, std::fwprintf, std::swprintf

Определено в заголовке <cwchar>
int wprintf( const wchar_t* format, ... );
(1)
int fwprintf( std::FILE* stream, const wchar_t* format, ... );
(2)
int swprintf( wchar_t* buffer, std::size_t size, const wchar_t* format, ... );
(3)

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

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

Параметры

stream - выходной поток файла для записи
buffer - указатель на широкую строку символов для записи
size - может быть записано до size - 1 символов, плюс завершающий нулевой символ
format - указатель на завершаемую нулём широкую строку, определяющую, как интерпретировать данные
... - аргументы, определяющие данные для вывода. Если любой аргумент после неявных преобразований не является типом, ожидаемым соответствующим спецификатором преобразования, или если аргументов меньше, чем требуется format, поведение не определено. Если аргументов больше, чем требуется format, лишние аргументы оцениваются и игнорируются

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

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

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

Преобразование
спецификатор
Описание Ожидаемый
тип аргумента
Модификатор
длины
→
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:

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

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

Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
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 (включая случай, когда size равно нулю).

Примечания

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

Пример

#include <clocale>
#include <cwchar>
#include <iostream>
#include <locale>
 
int main()
{
    char narrow_str[] = "z\u00df\u6c34\U0001f34c";
                  // or "zß水🍌";
                  // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";
    wchar_t warr[29]; // the expected string is 28 characters plus 1 null terminator
    std::setlocale(LC_ALL, "en_US.utf8");
 
    std::swprintf(warr, sizeof warr/sizeof *warr,
                  L"Converted from UTF-8: '%s'", narrow_str);
 
    std::wcout.imbue(std::locale("en_US.utf8"));
    std::wcout << warr << '\n';
}

Вывод:

Converted from UTF-8: 'zß水🍌'

См. также

printffprintfsprintfsnprintf
(C++11)
выводит форматированный вывод в stdout, поток файла или буфер
(функция)
vwprintfvfwprintfvswprintf
выводит форматированный вывод широких символов в stdout, поток файла или буфер, используя список переменных аргументов
(функция)
fputws
записывает широкую строку в поток файла
(функция)
C документация для wprintf, fwprintf, swprintf

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

Spec-Zone.ru

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