fmt README

The project's README from github.com/fmtlib/fmt. As one markdown file: README.md.

{fmt}

image image image fmt is continuously fuzzed at oss-fuzz OpenSSF Best Practices image Ask questions at StackOverflow with the tag fmt Support Ukraine

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

Documentation

Cheat Sheets

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

Try {fmt} in Compiler Explorer.

Live demo by Demoshell

Features

See the documentation for more details.

Examples

Print to stdout (run)

#include <fmt/core.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 up 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:

image

Performance

{fmt} can be tens of percent to 20–30 times faster than sprintf and iostreams, especially for numeric formatting. It minimizes dynamic memory allocations and can optionally compile format strings into efficient formatting code.

See format-benchmark and dtoa-benchmark for benchmarks and methodology.

Time per double (smaller is better):

Time per double for floating-point formatting methods

ostringstream and sprintf are omitted because they are an order of magnitude slower than the other methods.

Compile time and code bloat

The script bloat-test.py from format-benchmark measures the compile-time and code-size overhead each formatting method adds to application code. It generates 100 translation units and uses printf or its alternative five times in each to simulate a medium-sized project. Library and module build costs are excluded. Results on an Apple M5 Max running macOS 26.6.2 with Apple Clang 21.0.0 (clang-2100.1.1.101), taking the best of three runs, are shown in the following tables.

Optimized build (-O3)

Method Compile time, s Binary size, KiB Stripped size, KiB
printf 1.6 54 50
IOStreams 25.5 98 84
fmt 12.2 (headers) 5.1 54 50
fmt 12.2 (module) 3.7 59 50
Boost Format 1.92 49.1 517 317

Using modular {fmt} reduces optimized application-code compile time by 27% without changing the reported stripped binary size.

Non-optimized build

Method Compile time, s Binary size, KiB Stripped size, KiB
printf 1.6 54 50
IOStreams 26.0 88 68
fmt 12.2 (headers) 4.9 87 84
fmt 12.2 (module) 3.2 77 68
Boost Format 1.92 35.7 741 431

libc, libc++, libfmt, and libfmt-module were linked as shared libraries to compare formatting function overhead only. Boost Format is header-only.

Projects using {fmt}

Notable users include:

Find more projects using {fmt} on GitHub.

fmt (fmtlib/fmt)

Searching Database…

25.9K ·GitHub
Что это такое?{fmt} — это C++-библиотека форматирования с открытым исходным кодом: быстрая и безопасная замена C stdio и C++ iostreams с синтаксисом строки форматирования, похожим на питоновский.
Это отдельный инструмент или то, что встраивается в мой код?Это библиотека: вы компилируете её и линкуете в C++-программы. Минимальная конфигурация — всего три файла (core.h, format.h, format-inl.h), либо можно собрать её в header-only режиме, определив FMT_HEADER_ONLY.
Как попробовать её в деле, не настраивая целый проект?В README есть ссылка на страницу «Try {fmt} in Compiler Explorer», где примеры запускаются прямо в браузере; интеграция в реальную сборка описана на сайте документации.
Не потянет ли она за собой зависимости и не нужен ли самый свежий компилятор?Нет — это небольшая самодостаточная кодовая база без внешних зависимостей, ориентированная на переносимость и поддержку старых компиляторов.
Будет ли отформатированный вывод различаться в зависимости от локали или операционной системы?Нет — независимость от локали задана по умолчанию, и библиотека стремится к одинаковому выводу на всех платформах: одна и та же строка форматирования даёт один и тот же текст везде.
Она проверена в бою или это любительский проект?Проверена в бою: её используют Apple FoundationDB, Blizzard Battle.net, Ceph, ClickHouse, MariaDB, MongoDB, PyTorch, spdlog и Windows Terminal, а в комплекте — обширный набор тестов и непрерывный фаззинг.
Можно ли использовать её в коммерческих проектах?Да — она распространяется по лицензии MIT, и в README её прямо называют разрешительной (permissive).
Ошибки в строке форматирования правда могут сломать сборку?Да — в режиме C++20 спецификаторы проверяются на соответствие типам аргументов на этапе компиляции; например, форматирование строки спецификатором 'd' — это ошибка компиляции, а не баг во время выполнения.
Чем её форматирование чисел с плавающей точкой особенное?Оно построено на алгоритме Dragonbox, который гарантирует для чисел IEEE 754 правильное округление, краткость записи и восстановление при обратном преобразовании — напечатанное число превращается обратно в то же значение.
Она хорошо подходит для записи больших объёмов данных в файлы?В README показана запись файла из одного потока и отмечено, что это может быть до 9 раз быстрее, чем fprintf.
Creator
fmtlib
Size
17.3 MB
Stars
25.9K
Age
13y
Commits · 90 Days