std::vprintf, std::vfprintf, std::vsprintf, std::vsnprintf
Определён в заголовочном файле <cstdio> | ||
|---|---|---|
int vprintf( const char* format, std::va_list vlist ); | (1) | |
int vfprintf( std::FILE* stream, const char* format, std::va_list vlist ); | (2) | |
int vsprintf( char* buffer, const char* format, std::va_list vlist ); | (3) | |
int vsnprintf( char* buffer, std::size_t buf_size, const char* format, std::va_list vlist ); | (4) | (начиная с C++11) |
Загружает данные из мест, определённых с помощью vlist, преобразует их в эквивалентные символьные строки и записывает результаты в различные источники.
stdout.stream.buffer.buffer. Записывается не более buf_size - 1 символов. Полученная символьная строка завершается нулевым символом, если только buf_size не равно нулю. Если buf_size равно нулю, ничего не записывается, а buffer может быть нулевым указателем; однако возвращаемое значение (количество байтов, которые были бы записаны, не включая завершающий нулевой символ) всё равно вычисляется и возвращается.Параметры
| stream | - | выходной файловый поток для записи |
| buffer | - | указатель на символьную строку для записи |
| buf_size | - | максимальное количество символов для записи |
| format | - | указатель на символьную строку с нулевым завершением, задающую способ интерпретации данных |
| vlist | - | список переменного числа аргументов, содержащий данные для вывода |
Строка format состоит из обычных байтовых символов (за исключением %), которые без изменений копируются в выходной поток, и спецификаторов преобразования. Каждый спецификатор преобразования имеет следующий формат:
- вводный символ
%. - (необязательно) один или несколько флагов, изменяющих поведение преобразования:
-
-: результат преобразования выравнивается по левому краю поля (по умолчанию он выравнивается по правому краю). -
+: знак знаковых преобразований всегда добавляется перед результатом преобразования (по умолчанию перед результатом ставится знак минус, только если он отрицательный). -
пробел: если результат знакового преобразования не начинается со знака или является пустым, перед результатом добавляется пробел. Игнорируется, если указан флаг
+. -
#: выполняется преобразование в альтернативной форме. Точное действие описано в таблице ниже; в противном случае поведение не определено. -
0: при преобразовании целых чисел и чисел с плавающей точкой для заполнения поля используются нули в начале вместо символов пробела. Для целых чисел флаг игнорируется, если точность задана явно. При других преобразованиях использование этого флага приводит к неопределённому поведению. Игнорируется, если указан флаг-. -
(необязательно) целое значение или
*, задающее минимальную ширину поля. При необходимости результат дополняется символами пробела (по умолчанию): слева при выравнивании по правому краю или справа при выравнивании по левому краю. Если используется*, ширина задаётся дополнительным аргументом типа int, который передаётся перед преобразуемым аргументом и аргументом, задающим точность, если он указан. Если значение аргумента отрицательно, результат обрабатывается так, как если бы был указан флаг-, а ширина поля была положительной (Примечание: это минимальная ширина: значение никогда не усекается.). -
(необязательно)
.с последующим целым числом или*либо без них — задаёт точность преобразования. Если используется*, точность задаётся дополнительным аргументом типа int, который передаётся перед преобразуемым аргументом, но после аргумента, задающего минимальную ширину поля, если он указан. Если значение этого аргумента отрицательно, оно игнорируется. Если не указаны ни число, ни*, точность принимается равной нулю. Точное действие точности описано в таблице ниже. - (необязательно) модификатор длины, задающий размер аргумента (в сочетании со спецификатором формата преобразования он задаёт тип соответствующего аргумента).
- спецификатор формата преобразования.
Доступны следующие спецификаторы формата:
| Спецификатор преобразования | Пояснение | Ожидаемый тип аргумента |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Модификатор длины→ | hh | h | нет | l | ll | j | z | t | L | |
| Доступно только начиная с C++11→ | Да | Да | Да | Да | Да | |||||
% | Записывает литерал %. Полный спецификатор преобразования должен быть %%. | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
c | Записывает один символ.
| Н/Д | Н/Д |
int |
std::wint_t | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
s | Записывает символьную строку.
| Н/Д | Н/Д |
char*
|
wchar_t*
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
di | Преобразует знаковое целое число в десятичное представление [-]dddd.
|
signedchar
|
short |
int |
long |
longlong
|
※ | Н/Д | ||
bB (необязательно) (C++26) | Преобразует беззнаковое целое число в двоичное представление bbbb.
|
unsignedchar
|
unsignedshort
|
unsignedint
|
unsignedlong
|
unsignedlonglong
|
беззнаковый вариант std::ptrdiff_t
| Н/Д | ||
o | Преобразует беззнаковое целое число в восьмеричное представление oooo.
| Н/Д | ||||||||
xX | Преобразует беззнаковое целое число в шестнадцатеричное представление hhhh.
| Н/Д | ||||||||
u | Преобразует беззнаковое целое число в десятичное представление dddd.
| Н/Д | ||||||||
fF (C++11) | Преобразует число с плавающей точкой в десятичную запись вида [-]ddd.ddd.
| Н/Д | Н/Д |
double |
double (C++11)
| Н/Д | Н/Д | Н/Д | Н/Д |
longdouble
|
eE | Преобразует число с плавающей точкой в десятичную экспоненциальную запись.
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
aA (C++11) | Преобразует число с плавающей точкой в шестнадцатеричную экспоненциальную запись.
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
gG | Преобразует число с плавающей точкой в десятичную или десятичную экспоненциальную запись в зависимости от значения и точности.
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | |||
n | Возвращает количество символов, записанных этим вызовом функции к текущему моменту.
|
signedchar*
|
short*
|
int*
|
long*
|
longlong*
|
※ | Н/Д | ||
p | Записывает определяемую реализацией последовательность символов, представляющую указатель. | Н/Д | Н/Д |
void*
| Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| Примечания | ||||||||||
| Функции преобразования чисел с плавающей точкой преобразуют бесконечность в Не-число преобразуется в Вместо Спецификатор преобразования, используемый для вывода типов char, unsignedchar, signedchar, short и unsignedshort, принимает типы, полученные в результате продвижения аргументов по умолчанию, но перед выводом значение преобразуется в char, unsignedchar, signedchar, short и unsignedshort. Передавать значения этих типов безопасно благодаря продвижению, которое выполняется при вызове функции с переменным числом аргументов. Корректные спецификаторы преобразования для целочисленных типов фиксированной ширины ( Спецификатор преобразования После выполнения каждого спецификатора преобразования происходит точка последовательности; это позволяет сохранять результаты нескольких Если спецификация преобразования недопустима, поведение не определено. |
||||||||||
Возвращаемое значение
buf_size, функция возвращает общее количество символов (не включая завершающий нулевой байт), которое было бы записано, если бы ограничение не применялось.Примечания
Все эти функции вызывают va_arg по крайней мере один раз; значение arg после возврата не определено. Эти функции не вызывают va_end; это должен сделать вызывающий код.
Пример
#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <vector>
void debug_log(const char *fmt, ...)
{
std::time_t t = std::time(nullptr);
char time_buf[100];
std::strftime(time_buf, sizeof time_buf, "%D %T", std::gmtime(&t));
std::va_list args1;
va_start(args1, fmt);
std::va_list args2;
va_copy(args2, args1);
std::vector<char> buf(1 + std::vsnprintf(nullptr, 0, fmt, args1));
va_end(args1);
std::vsnprintf(buf.data(), buf.size(), fmt, args2);
va_end(args2);
std::printf("%s [debug]: %s\n", time_buf, buf.data());
}
int main()
{
debug_log("Logging, %d, %d, %d", 1, 2, 3);
}
Вывод:
04/13/15 15:09:18 [debug]: Logging, 1, 2, 3
См. также
|
(C++11) | выводит форматированные данные в stdout, файловый поток или буфер (функция) |
|
(C++11)(C++11)(C++11) | читает форматированные данные из stdin, файлового потока или буферас использованием списка переменного числа аргументов (функция) |
|
(C++23) | выводит данные в поддерживающий Unicode stdout или файловый поток, используя стираемое по типу представление аргументов (функция) |
|
(C++23) | выводит данные в stdout или файловый поток, используя стираемое по типу представление аргументов (функция) |
Документация C для vprintf, vfprintf, vsprintf, vsnprintf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/vfprintf