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) | |
Загружает данные из заданных мест, преобразует их в эквивалентные широкие строки и записывает результаты в различные приемники.
stream.buffer. Записывается не более size - 1 широких символов, за которыми следует нулевой широкий символ.Параметры
| stream | — | файловый поток вывода для записи |
| buffer | — | указатель на широкую строку символов для записи |
| size | — | можно записать до size - 1 символов плюс нулевой терминатор
|
| format | — | указатель на широкую строку с нулевым завершающим символом, определяющую, как интерпретировать данные |
| ... | — | аргументы, определяющие данные для вывода. Если какой-либо аргумент после преобразований по умолчанию не соответствует типу, ожидаемому соответствующим спецификатором преобразования, или если аргументов меньше, чем требуется format, поведение не определено. Если аргументов больше, чем требуется format, лишние аргументы оцениваются и игнорируются.
|
Строка форматирования состоит из печатных и пробельных символов (кроме %), без изменения выводимых в выходной поток, и спецификаторов форматирования. Структура спецификатора:
- символ-маркер
%
- символ-маркер
- (необязательно) один или несколько флагов, которые изменяют поведение форматирования:
-: выравнивание по левому краю внутри поля заданной ширины (по умолчанию по правому краю)+: принудительная печать знака+с положительными значениями (по умолчанию знаком дополняются только отрицательные значения)- пробел: не дополненные знаком или отсутствующие численные значения дополняются слева пробелом. Игнорируется, если присутствует флаг
+. #: выполнится альтернативное форматирование. См. таблицу ниже для подробностей: если альтернативное форматирование не определено, поведение не определено (UB).0: при печати чисел в поле заданной ширины заполнение пустоты идёт нулями вместо пробелов. Для целых чисел флаг игнорируется, если задано количество выводимых знаков (точность). При печати не чисел вызывает неопределённое поведение (UB). Флаг игнорируется, если присутствует флаг-.
- (необязательно) целое число, означающее минимальную ширину поля, или
*. Свободное пространство в поле по умолчанию заполняется пробелами, выравнивание по правому краю. При использовании*ширина поля задаётся дополнительным аргументом типаint. Отрицательное значение ширины эквивалентно применению дополнительно флага-.
(Замечание: задаётся минимальная ширина поля, форматируемое значение никогда не обрезается.)
- (необязательно) целое число, означающее минимальную ширину поля, или
- (необязательно)
.с целым числом,*или просто.. Число определяет точность. При использовании*точность задаётся дополнительным аргументом типаint. Просто.устанавливает нулевую точность. См. таблицу ниже для подробностей о действии точности на вывод.
- (необязательно)
- (необязательно)модификатор размера: определяет размер аргумента
- спецификатор формата вывода
Доступны следующие спецификаторы формата:
| Спецификатор | Описание | Флаг размера | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
hh
|
h
|
(нет) | l
|
ll
|
j
|
z
|
t
|
L
| ||
%
|
выводит символ %. Полный спецификатор формата %%.
|
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c
|
Аргумент сначала приводится к |
Н/Д | Н/Д | int |
wint_t |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s
|
Аргумент должен быть указателем на первый элемент массива символов, содержащих последовательность байт в мультибайтовой кодировке без сдвига. Конвертируется в массив |
Н/Д | Н/Д | char* |
wchar_t* |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
di
|
Точность определяет минимальное количество выводимых знаков. По умолчанию |
signed char |
short |
int |
long |
long long |
intmax_t |
signed size_t |
ptrdiff_t |
Н/Д |
o
|
Точность определяет минимальное количество выводимых знаков. По умолчанию |
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
unsigned version of ptrdiff_t |
Н/Д |
xX
|
Формат |
Н/Д | ||||||||
u
|
Точность определяет минимальное количество выводимых знаков. По умолчанию |
Н/Д | ||||||||
fF
|
Точность определяет минимальное количество выводимых знаков после запятой. По умолчанию |
Н/Д | Н/Д | double |
double (начиная с C99) |
Н/Д | Н/Д | Н/Д | Н/Д | long double |
e E
|
Формат |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
a A
|
Формат |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
g G
|
Формат
Альтернативная реализация: выводит десятичную точку даже если мантисса целая; нули в конце не убираются. |
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
n
|
Результат записывается в переменную, на которую указывает параметр. Данный спецификатор не допускает использования каких-либо флагов и модификаторов. |
signed char* |
short* |
int* |
long* |
long long* |
intmax_t* |
size_t* |
ptrdiff_t* |
Н/Д |
p
|
|
Н/Д | Н/Д | void*
|
Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
|
Формат чисел с плавающей запятой выводит бесконечность как NaN преобразуется в Несмотря на то, что Корректные преобразования для типов фиксированного размера (int8_t и прочих) объявлены в <cinttypes>(C++) или<inttypes.h> (C) (вызов PRIdMAX, PRIuMAX, и прочих соответствует Записывающий спецификатор Каждый спецификатор формата происводит вычисление своего аргумента в момент печати. Это позволяет вызывать Неправильный спецификатор формата вызывает неопределённое поведение (UB). | ||||||||||
Возвращаемое значение
size (в том числе, когда size равно нулю).Примечание
Хотя узкие строки предоставляют std::snprintf, который позволяет определить требуемый размер выходного буфера, для широких строк нет эквивалента, и для определения размера буфера программе может потребоваться вызвать std::swprintf, проверить значение результата и перераспределить больший буфер, повторяя попытку до достижения успеха.
Пример
#include <clocale>
#include <cwchar>
#include <iostream>
#include <locale>
int main()
{
char narrow_str[] = "z\u00df\u6c34\U0001f34c";
// или "zß水🍌";
// или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";
wchar_t warr[29]; // ожидаемая строка состоит из 28 символов плюс 1 нулевой терминатор
std::setlocale(LC_ALL, "en_US.utf8");
std::swprintf(warr, sizeof warr/sizeof *warr,
L"Конвертировано из UTF-8: '%s'", narrow_str);
std::wcout.imbue(std::locale("en_US.utf8"));
std::wcout << warr << '\n';
}
Вывод:
Конвертировано из UTF-8: 'zß水🍌'
Смотрите также
(C++11) |
отпечатки отформатировать вывод stdout, поток файл или буфер Оригинал: prints formatted output to stdout, a file stream or a buffer Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (функция) |
| печатает вывод форматированных широких символов в stdout, файловый поток или буфер, используя список переменных аргументов (функция) | |
| записывает широкую строку в файловый поток (функция) | |
Документация C по wprintf, fwprintf, swprintf
| |