{fmt}
{fmt}是一个开源的格式化库,用于替代C的stdio和C++的iostream。
特色:
- 简便的格式化API,提供本地化用的位置参数。
- 实现C++ 20 std::format
- 和python的format类似的格式化字符串语法
- 使用Dragonbox算法提供快速IEEE 754浮点数格式化和舍入,
- 可移植的Unicode支持
- 安全的printf实现,包括POSIX位置参数扩展。
- 可扩展:支持用户自定义类型
- 高效:比默认的标准库实现中的(s)printf、iostream、to_string和to_chars更快
- 源代码和编译后代码尺寸小
- 可靠:拥有广泛的测试并持续改进
- 容易使用:无外部依赖,MIT许可
- 可移植性:在不同平台上提供一致的输出结果,支持旧编译器
- 代码整洁,不会产生编译警告
- 默认与本地化环境(Locale)无关
- 通过FMT_HEADR_ONLY宏,可以作为header-only库使用
代码示例
打印到标准输出
#include <fmt/core.h>
int main() {
fmt::print("Hello, world!\n");
}
格式化字符串
std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."
Format a string using positional arguments (run)
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
// s == "I'd rather be happy than right."
打印chrono时长
#include <fmt/chrono.h>
int main() {
using namespace std::literals::chrono_literals;
fmt::print("Default format: {} {}\n", 42s, 100ms);
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
}
输出:
Default format: 42s 100ms
strftime-like format: 03:15:30
打印容器
#include <vector>
#include <fmt/ranges.h>
int main() {
std::vector<int> v = {1, 2, 3};
fmt::print("{}\n", v);
}
输出:
[1, 2, 3]
在编译期检查格式化字符串
下面的代码在C++20中产生编译器错误,因为对字符串参数来说d是非法的格式符
std::string s = fmt::format("{:d}", "I am not a number");
输出到文件
#include <fmt/os.h>
int main() {
auto out = fmt::output_file("guide.txt");
out.print("Don't {}", "Panic");
}
运行速度是fprintf的5到9倍。
最后修改 July 6, 2023: update (eaffefbf)