std::vprint_unicode, std::vprint_unicode_buffered
来自 cppreference.cn
定义于头文件 <print> |
||
void vprint_unicode( std::FILE* stream, std::string_view fmt, std::format_args args ); |
(1) | (自 C++23 起) |
void vprint_unicode_buffered( std::FILE* stream, std::string_view fmt, std::format_args args ); |
(2) | (自 C++23 起) |
void vprint_unicode_buffered( std::string_view fmt, std::format_args args ); |
(3) | (自 C++23 起) |
根据格式字符串 fmt 格式化 args,并将结果写入输出流。
1) 按顺序执行以下操作
- 锁定 stream。
- 设 out 表示由 args 提供的格式化参数的字符表示,其根据 fmt 中给出的规范进行格式化。
- 将 out 写入 stream
- 如果 stream 指的是仅能通过 原生 Unicode API 显示 Unicode 的终端,则刷新 stream 并使用原生 Unicode API 将 out 写入终端。
- 否则,将未修改的 out 写入 stream。
在函数退出时无条件地解锁 stream。
如果满足以下任一条件,则行为未定义
- stream 不是指向输出 C 流的有效指针。
- 当使用原生 Unicode API 时,out 包含无效的 Unicode 代码单元。
2) 等价于 std::string out = std::vformat(fmt, args);
std::vprint_unicode(stream, "{}", std::make_format_args(out));。
std::vprint_unicode(stream, "{}", std::make_format_args(out));。
3) 等价于 std::vprint_unicode_buffered(stdout, fmt, args)。
在将字符写入输出流后,建立一个可观察的检查点。 |
(自 C++26 起) |
目录 |
[编辑] 参数
stream | - | 要写入的输出文件流 | ||||||||||||||||||||||||||||||||||||||||||||||
fmt | - |
每个替换字段具有以下格式
1) 没有格式规范的替换字段
2) 带有格式规范的替换字段
| ||||||||||||||||||||||||||||||||||||||||||||||
args | - | 要格式化的参数 |
[编辑] 异常
- std::bad_alloc,如果内存分配失败。
- std::system_error,如果写入流失败。
- 传播使用的 格式化器 抛出的任何异常,例如 std::format_error。
[编辑] 注解
C++ 标准鼓励实现者在 out 包含无效的 Unicode 代码单元时生成诊断消息。
在 POSIX 上,写入终端是使用常用的标准 I/O 函数完成的,因此无需像对待任何其他文件流一样特别对待终端。
在 Windows 上,如果 GetConsoleMode(_get_osfhandle(_fileno(stream))) 返回非零值,则流指的是终端(请参阅 Windows 文档中的 GetConsoleMode
、_get_osfhandle
和 _fileno
)。Windows 上的原生 Unicode API 是 WriteConsoleW
。
如果调用原生 Unicode API 需要转码,则无效的代码单元将替换为 U+FFFD
替换字符(参见“Unicode 标准 - 核心规范”,第 3.9 章)。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_print |
202207L |
(C++23) | 格式化输出 |
202403L |
(C++26) (DR23) |
无缓冲格式化输出 | |
202406L |
(C++26) (DR23) |
为更多可格式化类型启用无缓冲格式化输出 | |
__cpp_lib_format |
202207L |
(C++23) | 公开 std::basic_format_string |
[编辑] 示例
本节尚不完整 原因:没有示例 |
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 4044 | C++23 | 如果 stream 引用的 终端可以显示 Unicode,则始终使用原生 Unicode API |
仅当终端只能使用 原生 Unicode API 显示 Unicode 时才使用 |
P3107R5 | C++23 | 打印操作始终是缓冲的 | 提供无缓冲打印操作 |
P3235R3 | C++23 | 添加的函数的名称 由 P3107R5 误导 |
更改了函数名称 |
[编辑] 参见
使用 类型擦除 的参数表示形式打印到 stdout 或文件流 (函数) | |
(C++23) |
使用 类型擦除 的参数表示形式执行 Unicode 感知输出 (函数) |
(C++23) |
使用参数的 格式化 表示形式打印到 stdout 或文件流 (函数模板) |
(C++20) |
将参数的格式化表示形式存储在新字符串中 (函数模板) |
[编辑] 外部链接
1. | Unicode |
2. | Unicode 标准版本 14.0 - 核心规范 |