{fmt} 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
{fmt} 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
{fmt} 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT
开发语言 C/C++
操作系统 跨平台
软件类型 开源软件
开源组织
地区 不详
投 递 者 osc_74854758
适用人群 未知
收录时间 2024-11-13

软件简介

{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的现代终端上输出

image

基准测试

性能测试

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快:

image

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击加入讨论🔥(4) 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
4 评论
1 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部