std::vprintf, std::vfprintf, std::vsprintf, std::vsnprintf
Min standard notice:
Header: <cstdio>
Loads the data from the locations, defined by vlist, converts them to character string equivalents and writes the results to a variety of sinks.
# Declarations
int vprintf( const char* format, std::va_list vlist );
int vfprintf( std::FILE* stream, const char* format, std::va_list vlist );
int vsprintf( char* buffer, const char* format, std::va_list vlist );
int vsnprintf( char* buffer, std::size_t buf_size, const char* format, std::va_list vlist );
(since C++11)
# Parameters
stream: output file stream to write tobuffer: pointer to a character string to write tobuf_size: maximum number of characters to writeformat: pointer to a null-terminated character string specifying how to interpret the datavlist: variable argument list containing the data to print
# Notes
All these functions invoke va_arg at least once, the value of arg is indeterminate after the return. These functions do not invoke va_end, and it must be done by the caller.
# Example
#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);
}