std::stringstream în C++

Flux care scrie și citește într-un șir din memorie; str() îi dă sau îi schimbă textul.

Sintaxă
#include <sstream>
std::stringstream ss;
ss << valoare;         // scriere
ss >> variabila;       // citire
std::string s = ss.str();
ss.str("text nou");

Ce face std::stringstream

Un std::stringstream se comportă ca std::cin și std::cout în același timp, dar datele stau într-un std::string din memorie. Poți scrie în el cu << și citi din el cu >>.

ss.str() returnează o copie a textului din flux, iar ss.str("...") îl înlocuiește. Când refolosești un flux, apelează și ss.clear(), ca să ștergi eventuala stare de eroare sau eof rămasă.

Dacă doar citești, std::istringstream este mai clar; dacă doar scrii, std::ostringstream.

Ce returnează

str() returnează un std::string cu tot conținutul fluxului.

Exemple

Exemplul 1: Scriere, apoi citire

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

int main() {
    std::stringstream ss;
    ss << "Ana " << 21 << ' ' << 9.5;
    std::cout << "Text: " << ss.str() << '\n';

    std::string nume;
    int varsta;
    double medie;
    ss >> nume >> varsta >> medie;
    std::cout << nume << " | " << varsta << " | " << medie << '\n';
}

Rezultat

Text: Ana 21 9.5
Ana | 21 | 9.5

Exemplul 2: Refolosirea fluxului cu str() și clear()

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;
    int suma = 0, x;
    for (const char* rand : {"1 2 3", "10 20", "100"}) {
        ss.clear();
        ss.str(rand);
        while (ss >> x) suma += x;
        std::cout << "După \"" << rand << "\": suma " << suma << '\n';
    }
}

Rezultat

După "1 2 3": suma 6
După "10 20": suma 36
După "100": suma 136

Greșeli frecvente

  • Refolosești fluxul doar cu ss.str("..."), fără ss.clear(): după prima citire completă, fluxul este în starea eof și nu mai citește nimic.
  • Crezi că ss.str("") golește și starea. Golește doar textul; starea se resetează cu clear().

Comenzi înrudite

  • std::istringstream: Flux de citire dintr-un șir: desparte un text în cuvinte, numere sau câmpuri.
  • std::ostringstream: Flux de scriere într-un șir: construiește text cu << și manipulatori, apoi îl iei cu str().
  • std::getline: Citește un rând întreg, cu spații cu tot, într-un std::string.
  • std::to_string: Transformă un număr în std::string, de exemplu 42 în „42”.