std::vprint_unicode, std::vprint_unicode_buffered - cppreference.com
From cppreference.com
| Defined in header |
||
void vprint_unicode( std::FILE* stream, std::string_view fmt, std::format_args args ); |
(1) | (since C++23) |
void vprint_unicode_buffered( std::FILE* stream, std::string_view fmt, std::format_args args ); |
(2) | (since C++23) |
void vprint_unicode_buffered( std::string_view fmt, std::format_args args ); |
(3) | (since C++23) |
Format args according to the format string fmt, and writes the result to the output stream.
1) Performs the following operations in order:
- Locks
stream. - Let
outdenote the character representation of formatting arguments provided byargsformatted according to specifications given infmt. - Writes
outtostream:
- If
streamrefers to a terminal that is only capable of displaying Unicode via a native Unicode API, flushesstreamand writesoutto the terminal using the native Unicode API. - Otherwise, writes unmodified
outto thestream.
- If
Unconditionally unlocks stream on function exit.
If any of the following conditions is satisfied, the behavior is undefined:
streamis not a valid pointer to an output C stream.outcontains invalid Unicode code units when the native Unicode API is used.
2) Equivalent to
std::string out = std::vformat(fmt, args); std::vprint_unicode(stream, "{}", std::make_format_args(out));
3) Equivalent to std::vprint_unicode_buffered(stdout, fmt, args).
Parameters
| stream | - | output file stream to write to | ||||||||||||||||||||||||||||||||||||||||||||
| fmt | - | an object that represents the format string. The format string consists of
Each replacement field has the following format:
1) replacement field without a format specification 2) replacement field with a format specification
| ||||||||||||||||||||||||||||||||||||||||||||
| args | - | arguments to be formatted | ||||||||||||||||||||||||||||||||||||||||||||
Exceptions
- std::bad_alloc on allocation failure.
- std::system_error, if writing to the stream fails.
- Propagates any exception thrown by used formatters, e.g. std::format_error.
Notes
The C++ standard encourages the implementers to produce a diagnostic message if out contains invalid Unicode code units.
On POSIX, writing to a terminal is done using the usual standard I/O functions, so there is no need to treat a terminal differently to any other file stream.
On Windows, the stream refers to a terminal if GetConsoleMode(_get_osfhandle(_fileno(stream))) returns nonzero (see Windows documentation for GetConsoleMode, _get_osfhandle, and _fileno). The native Unicode API on Windows is WriteConsoleW.
If invoking the native Unicode API requires transcoding, the invalid code units are substituted with U+FFFD REPLACEMENT CHARACTER (see "The Unicode Standard - Core Specification", Chapter 3.9).
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_print |
202207L |
(C++23) | Formatted output |
202403L |
(C++26) (DR23) |
Unbuffered formatted output | |
202406L |
(C++26) (DR23) |
Enabling unbuffered formatted output for more formattable types | |
__cpp_lib_format |
202207L |
(C++23) | Exposing std::basic_format_string |
Example
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4044 | C++23 | the native Unicode API was always used if the terminal referred to by stream can display Unicode
|
only used if the terminal can only use the native Unicode API to display Unicode |
| P3107R5 | C++23 | printing operations were always buffered | provides unbuffered printing operations |
| P3235R3 | C++23 | the names of the functions added by P3107R5 were misleading |
changed the function names |