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 stareaeofși nu mai citește nimic. - Crezi că
ss.str("")golește și starea. Golește doar textul; starea se resetează cuclear().
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”.