{fmt} 是一个开源的格式化库,提供了一个快速且安全的替代C语言标准I/O和C++ iostreams的方案。
使用例子
输出到标准输出 (run)
#include <fmt/core.h> int main() { fmt::print("Hello, world!\n"); }
格式化一个字符串 (run)
std::string s = fmt::format("The answer is {}.", 42); // s == "The answer is 42."
使用位置参数格式化字符串 (run)
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy"); // s == "I'd rather be happy than right."
打印日期和时间 (run)
#include <fmt/chrono.h> int main() { auto now = std::chrono::system_clock::now(); fmt::print("Date and time: {}\n", now); fmt::print("Time: {:%H:%M}\n", now); }
输出:
Date and time: 2023-12-26 19:10:31.557195597
Time: 19:10
打印一个容器 (run)
#include <vector> #include <fmt/ranges.h> int main() { std::vector<int> v = {1, 2, 3}; fmt::print("{}\n", v); }
输出:
[1, 2, 3]
在编译时检查格式字符串
std::string s = fmt::format("{:d}", "I am not a number");
这在C++20中会导致编译时错误,因为`d`是字符串的无效格式说明符。
从单一线程写入文件
#include <fmt/os.h> int main() { auto out = fmt::output_file("guide.txt"); out.print("Don't {}", "Panic"); }
比fprintf快5到9倍
打印带有颜色和文本样式的文本
#include <fmt/color.h> int main() { fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold, "Hello, {}!\n", "world"); fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | fmt::emphasis::underline, "Olá, {}!\n", "Mundo"); fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, "你好{}!\n", "世界"); }
在支持Unicode的现代终端上输出
基准测试
性能测试
Library | Method | Run Time, s |
---|---|---|
libc | printf | 0.91 |
libc++ | std::ostream | 2.49 |
{fmt} 9.1 | fmt::print | 0.74 |
Boost Format 1.80 | boost::format | 6.26 |
Folly Format | folly::format | 1.87 |
{fmt} 是基准测试方法中最快的,比 printf快约20%。
上述结果是由在 macOS 12.6.1 上使用 clang++ 编译 tinyformat_test.cpp 文件生成的,编译选项为 -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT,并且取三次运行中的最好成绩。在测试中,格式字符串 "%0.10f:%04d:%+g:%s:%p:%c:%%\n" 或其等效形式被填充了200万次,输出被发送到 /dev/null;更多细节请参考源代码。
{fmt} 在 IEEE754 浮点数和双精度数格式化 (dtoa-benchmark)方面比 std::ostringstream 和 sprintf 快20-30倍,并且比 double-conversion 和ryu快:
评论