std::format_to în C++

Formatare C++20

Scrie textul formatat direct într-un iterator de ieșire, de exemplu la finalul unui șir.

Sintaxă
#include <format>
OutputIt format_to(OutputIt iesire, sablon, valori...);

Ce face std::format_to

std::format_to formatează la fel ca std::format, dar nu creează un șir nou: scrie caracterele prin iteratorul primit. Cel mai des folosit este std::back_inserter(sir), care adaugă la finalul unui std::string existent.

Poate scrie și într-un tablou char, dar atunci tu răspunzi de mărimea lui: funcția nu verifică dacă textul încape. Returnează iteratorul de după ultimul caracter scris, util pentru a pune terminatorul '\0'.

Parametri

Parametru Descriere
iesire Iterator de ieșire: std::back_inserter(sir), un pointer char* etc.
sablon Textul cu marcaje {}, cunoscut la compilare.
valori... Valorile care înlocuiesc marcajele.

Ce returnează

Iteratorul de după ultimul caracter scris.

Exemple

Exemplul 1: Construirea unui raport într-un singur șir

#include <format>
#include <iterator>
#include <print>
#include <string>

int main() {
    struct Produs { std::string nume; int bucati; double pret; };
    Produs cos[] = {{"Caiet", 3, 4.5}, {"Pix", 10, 2.2}, {"Rucsac", 1, 129.0}};

    std::string raport;
    for (const auto& p : cos) {
        std::format_to(std::back_inserter(raport), "{:<8}{:>3} x {:>7.2f}\n", p.nume, p.bucati, p.pret);
    }
    std::print("{}", raport);
}

Rezultat

Caiet     3 x    4.50
Pix      10 x    2.20
Rucsac    1 x  129.00

Exemplul 2: Scriere într-un tablou de char

Iteratorul returnat arată unde s-a terminat textul; acolo punem '\0'.

#include <cstdio>
#include <format>

int main() {
    char buffer[64];
    char* sfarsit = std::format_to(buffer, "Comanda {:05} - {} lei", 42, 99);
    *sfarsit = '\0';
    std::puts(buffer);
    std::printf("Caractere scrise: %td\n", sfarsit - buffer);
}

Rezultat

Comanda 00042 - 99 lei
Caractere scrise: 22

Greșeli frecvente

  • Scrii într-un tablou char prea mic: format_to nu se oprește la capătul lui și strică memoria vecină (comportament nedefinit). Folosește std::format_to_n sau un std::string cu back_inserter.
  • Uiți '\0' la final când scrii într-un char[] și apoi îl folosești ca șir C.

Comenzi înrudite

  • std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).
  • std::vformat: Formatează după un șablon cunoscut abia la rulare, de exemplu ales după limbă.
  • std::string::append: Adaugă text la sfârșitul șirului, la fel ca +=, cu variante pentru bucăți și caractere repetate.