fmt

2025-12-10 0 392

{fmt} is an open-source formatting library providing a fast and safe
alternative to C stdio and C++ iostreams.

If you like this project, please consider donating to one of the funds
that help victims of the war in Ukraine: https://www.s*t*op*putin.net/.

Documentation

Cheat Sheets

Q&A: ask questions on StackOverflow with the tag
fmt.

Try {fmt} in Compiler Explorer.

Features

  • Simple format API with positional
    arguments for localization
  • Implementation of C++20
    std::format and
    C++23 std::print
  • Format string syntax similar
    to Python\’s
    format
  • Fast IEEE 754 floating-point formatter with correct rounding,
    shortness and round-trip guarantees using the
    Dragonbox algorithm
  • Portable Unicode support
  • Safe printf
    implementation
    including the POSIX extension for positional arguments
  • Extensibility: support for user-defined
    types
  • High performance: faster than common standard library
    implementations of (s)printf, iostreams, to_string and
    to_chars, see Speed tests and Converting a
    hundred million integers to strings per
    second
  • Small code size both in terms of source code with the minimum
    configuration consisting of just three files, base.h, format.h
    and format-inl.h, and compiled code; see Compile time and code
    bloat
  • Reliability: the library has an extensive set of
    tests and is
    continuously fuzzed
  • Safety: the library is fully type-safe, errors in format strings can
    be reported at compile time, automatic memory management prevents
    buffer overflow errors
  • Ease of use: small self-contained code base, no external
    dependencies, permissive MIT
    license
  • Portability with
    consistent output across platforms and support for older compilers
  • Clean warning-free codebase even on high warning levels such as
    -Wall -Wextra -pedantic
  • Locale independence by default
  • Optional header-only configuration enabled with the
    FMT_HEADER_ONLY macro

See the documentation for more details.

Examples

Print to stdout (run)

#include <fmt/base.h>

int main() {
  fmt::print(\"Hello, world!\\n\");
}

Format a string (run)

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.\"

Print dates and times (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);
}

Output:

Date and time: 2023-12-26 19:10:31.557195597
Time: 19:10

Print a container (run)

#include <vector>
#include <fmt/ranges.h>

int main() {
  std::vector<int> v = {1, 2, 3};
  fmt::print(\"{}\\n\", v);
}

Output:

[1, 2, 3]

Check a format string at compile time

std::string s = fmt::format(\"{:d}\", \"I am not a number\");

This gives a compile-time error in C++20 because d is an invalid
format specifier for a string.

Write a file from a single thread

#include <fmt/os.h>

int main() {
  auto out = fmt::output_file(\"guide.txt\");
  out.print(\"Don\'t {}\", \"Panic\");
}

This can be 5 to 9 times faster than
fprintf.

Print with colors and text styles

#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\", \"世界\");
}

Output on a modern terminal with Unicode support:

Benchmarks

Speed tests

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} is the fastest of the benchmarked methods, ~20% faster than
printf.

The above results were generated by building tinyformat_test.cpp on
macOS 12.6.1 with clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT, and
taking the best of three runs. In the test, the format string
\"%0.10f:%04d:%+g:%s:%p:%c:%%\\n\" or equivalent is filled 2,000,000
times with output sent to /dev/null; for further details refer to the
source.

{fmt} is up to 20-30x faster than std::ostringstream and sprintf on
IEEE754 float and double formatting
(dtoa-benchmark) and faster
than double-conversion
and ryu:

Compile time and code bloat

The script bloat-test.py from format-benchmark tests compile
time and code bloat for nontrivial projects. It generates 100 translation units
and uses printf() or its alternative five times in each to simulate a
medium-sized project. The resulting executable size and compile time (Apple
clang version 15.0.0 (clang-1500.1.0.2.5), macOS Sonoma, best of three) is shown
in the following tables.

Optimized build (-O3)

Method Compile Time, s Executable size, KiB Stripped size, KiB
printf 1.6 54 50
IOStreams 25.9 98 84
fmt 83652df 4.8 54 50
tinyformat 29.1 161 136
Boost Format 55.0 530 317

{fmt} is fast to compile and is comparable to printf in terms of per-call
binary size (within a rounding error on this system).

Non-optimized build

Method Compile Time, s Executable size, KiB Stripped size, KiB
printf 1.4 54 50
IOStreams 23.4 92 68
{fmt} 83652df 4.4 89 85
tinyformat 24.5 204 161
Boost Format 36.4 831 462

libc, lib(std)c++, and libfmt are all linked as shared libraries
to compare formatting function overhead only. Boost Format is a
header-only library so it doesn\’t provide any linkage options.

Running the tests

Please refer to Building the
library for
instructions on how to build the library and run the unit tests.

Benchmarks reside in a separate repository,
format-benchmarks, so to
run the benchmarks you first need to clone this repository and generate
Makefiles with CMake:

$ git clone --recursive https://*g*i*thub.com/fmtlib/format-benchmark.git
$ cd format-benchmark
$ cmake .

Then you can run the speed test:

$ make speed-test

or the bloat test:

$ make bloat-test

Migrating code

clang-tidy v18 provides the
modernize-use-std-print
check that is capable of converting occurrences of printf and
fprintf to fmt::print if configured to do so. (By default it
converts to std::print.)

Notable projects using this library

  • 0 A.D.: a free, open-source, cross-platform
    real-time strategy game
  • AMPL/MP: an open-source library for
    mathematical programming
  • Apple\’s FoundationDB: an open-source,
    distributed, transactional key-value store
  • Aseprite: animated sprite
    editor & pixel art tool
  • AvioBook: a comprehensive aircraft
    operations suite
  • Blizzard Battle.net: an online gaming
    platform
  • Celestia: real-time 3D visualization of
    space
  • Ceph: a scalable distributed storage system
  • ccache: a compiler cache
  • ClickHouse: an
    analytical database management system
  • ContextVision: medical imaging software
  • Contour: a modern
    terminal emulator
  • CUAUV: Cornell University\’s autonomous
    underwater vehicle
  • Drake: a planning, control, and analysis
    toolbox for nonlinear dynamical systems (MIT)
  • Envoy: C++ L7 proxy and
    communication bus (Lyft)
  • FiveM: a modification framework for GTA V
  • fmtlog: a performant
    fmtlib-style logging library with latency in nanoseconds
  • Folly: Facebook open-source
    library
  • GemRB: a portable open-source implementation
    of Bioware\’s Infinity Engine
  • Grand Mountain
    Adventure:
    a beautiful open-world ski & snowboarding game
  • HarpyWar/pvpgn: Player vs
    Player Gaming Network with tweaks
  • KBEngine: an open-source
    MMOG server engine
  • Keypirinha: a semantic launcher for
    Windows
  • Kodi (formerly xbmc): home theater software
  • Knuth: high-performance Bitcoin full-node
  • libunicode: a
    modern C++17 Unicode library
  • MariaDB: relational database management
    system
  • Microsoft Verona: research
    programming language for concurrent ownership
  • MongoDB: distributed document database
  • MongoDB Smasher: a small
    tool to generate randomized datasets
  • OpenSpace: an open-source
    astrovisualization framework
  • PenUltima Online (POL): an MMO server,
    compatible with most Ultima Online clients
  • PyTorch: an open-source
    machine learning library
  • quasardb: a distributed,
    high-performance, associative database
  • Quill: asynchronous low-latency
    logging library
  • QKW: generalizing aliasing to
    simplify navigation, and execute complex multi-line terminal
    command sequences
  • redis-cerberus: a Redis
    cluster proxy
  • redpanda: a 10x faster Kafka®
    replacement for mission-critical systems written in C++
  • rpclib: a modern C++ msgpack-RPC server and
    client library
  • Salesforce Analytics
    Cloud:
    business intelligence software
  • Scylla: a Cassandra-compatible NoSQL
    data store that can handle 1 million transactions per second on a
    single server
  • Seastar: an advanced, open-source
    C++ framework for high-performance server applications on modern
    hardware
  • spdlog: super fast C++ logging
    library
  • Stellar: financial platform
  • Touch Surgery: surgery simulator
  • TrinityCore:
    open-source MMORPG framework
  • ? userver framework: open-source
    asynchronous framework with a rich set of abstractions and database
    drivers
  • Windows Terminal: the new
    Windows terminal

More…

If you are aware of other projects using this library, please let me
know by email or by submitting an
issue.

Motivation

So why yet another formatting library?

There are plenty of methods for doing this task, from standard ones like
the printf family of function and iostreams to Boost Format and
FastFormat libraries. The reason for creating a new library is that
every existing solution that I found either had serious issues or
didn\’t provide all the features I needed.

printf

The good thing about printf is that it is pretty fast and readily
available being a part of the C standard library. The main drawback is
that it doesn\’t support user-defined types. printf also has safety
issues although they are somewhat mitigated with __attribute__
((format (printf,
…)) in
GCC. There is a POSIX extension that adds positional arguments required
for
i18n
to printf but it is not a part of C99 and may not be available on some
platforms.

iostreams

The main issue with iostreams is best illustrated with an example:

std::cout << std::setprecision(2) << std::fixed << 1.23456 << \"\\n\";

which is a lot of typing compared to printf:

printf(\"%.2f\\n\", 1.23456);

Matthew Wilson, the author of FastFormat, called this \”chevron hell\”.
iostreams don\’t support positional arguments by design.

The good part is that iostreams support user-defined types and are safe
although error handling is awkward.

Boost Format

This is a very powerful library that supports both printf-like format
strings and positional arguments. Its main drawback is performance.
According to various benchmarks, it is much slower than other methods
considered here. Boost Format also has excessive build times and severe
code bloat issues (see Benchmarks).

FastFormat

This is an interesting library that is fast, safe and has positional
arguments. However, it has significant limitations, citing its author:

Three features that have no hope of being accommodated within the
current design are:

  • Leading zeros (or any other non-space padding)
  • Octal/hexadecimal encoding
  • Runtime width/alignment specification

It is also quite big and has a heavy dependency, on STLSoft, which might be
too restrictive for use in some projects.

Boost Spirit.Karma

This is not a formatting library but I decided to include it here for
completeness. As iostreams, it suffers from the problem of mixing
verbatim text with arguments. The library is pretty fast, but slower on
integer formatting than fmt::format_to with format string compilation
on Karma\’s own benchmark, see Converting a hundred million integers to
strings per
second.

License

{fmt} is distributed under the MIT
license.

Documentation License

The Format String Syntax section
in the documentation is based on the one from Python string module
documentation.
For this reason, the documentation is distributed under the Python
Software Foundation license available in
doc/python-license.txt.
It only applies if you distribute the documentation of {fmt}.

Maintainers

The {fmt} library is maintained by Victor Zverovich
(vitaut) with contributions from many other
people. See
Contributors and
Releases for some of the
names. Let us know if your contribution is not listed or mentioned
incorrectly and we\’ll make it right.

Security Policy

To report a security issue, please disclose it at security
advisory.

This project is maintained by a team of volunteers on a
reasonable-effort basis. As such, please give us at least 90 days to
work on a fix before public exposure.

下载源码

通过命令行克隆项目:

git clone https://github.com/fmtlib/fmt.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 fmt https://www.zuozi.net/33622.html

tinyrenderer
上一篇: tinyrenderer
ZServer4D
下一篇: ZServer4D
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务