std::ostringstream în C++

Flux de scriere într-un șir: construiește text cu << și manipulatori, apoi îl iei cu str().

Sintaxă
#include <sstream>
std::ostringstream out;
out << valoare;
std::string text = out.str();

Ce face std::ostringstream

std::ostringstream adună tot ce scrii în el cu << într-un șir din memorie. La final, str() îți dă textul complet. Toți manipulatorii de la std::cout funcționează: std::setw, std::fixed, std::setprecision, std::hex.

Înainte de C++20 era modul obișnuit de a construi texte cu numere formatate. Astăzi, std::format face același lucru mai scurt, dar ostringstream rămâne util pentru tipurile care au doar operator<<.

Exemple

Exemplul 1: Preț formatat ca text

#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>

int main() {
    double pret = 49.9;
    std::ostringstream out;
    out << std::fixed << std::setprecision(2) << pret << " lei";
    std::string eticheta = out.str();
    std::cout << "Eticheta: " << eticheta << " (" << eticheta.size() << " caractere)\n";
}

Rezultat

Eticheta: 49.90 lei (9 caractere)

Exemplul 2: Lipirea elementelor unei liste

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> orase = {"Iași", "Cluj", "Brașov"};
    std::ostringstream out;
    for (std::size_t i = 0; i < orase.size(); ++i) {
        if (i > 0) out << ", ";
        out << orase[i];
    }
    std::cout << "Orașe: " << out.str() << '\n';
}

Rezultat

Orașe: Iași, Cluj, Brașov

Greșeli frecvente

  • Apelezi out.str() de mai multe ori într-o buclă mare: de fiecare dată se face o copie a întregului text.

Comenzi înrudite

  • std::stringstream: Flux care scrie și citește într-un șir din memorie; str() îi dă sau îi schimbă textul.
  • std::istringstream: Flux de citire dintr-un șir: desparte un text în cuvinte, numere sau câmpuri.
  • std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).
  • std::to_string: Transformă un număr în std::string, de exemplu 42 în „42”.