std::istringstream în C++

Flux de citire dintr-un șir: desparte un text în cuvinte, numere sau câmpuri.

Sintaxă
#include <sstream>
std::istringstream in(text);
in >> variabila;

Ce face std::istringstream

std::istringstream primește un text și îl oferă ca intrare, la fel ca std::cin. Cu >> îl desparți în cuvinte (după spații) și transformi automat bucățile în numere.

Este metoda clasică pentru prelucrarea unui rând citit cu getline: întâi citești tot rândul, apoi îl desparți cu un istringstream. Cu std::getline(in, camp, ',') desparți după alt caracter.

Exemple

Exemplul 1: Împărțirea unei propoziții în cuvinte

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

int main() {
    std::istringstream in("Ana   are\tmere și pere");
    std::vector<std::string> cuvinte;
    std::string c;
    while (in >> c) {
        cuvinte.push_back(c);
    }
    std::cout << cuvinte.size() << " cuvinte:\n";
    for (const auto& cuv : cuvinte) {
        std::cout << "[" << cuv << "]\n";
    }
}

Rezultat

5 cuvinte:
[Ana]
[are]
[mere]
[și]
[pere]

Exemplul 2: Un rând CSV transformat în valori

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

int main() {
    std::string rand = "Laptop,3,2499.90";
    std::istringstream in(rand);
    std::string produs, bucati, pret;
    std::getline(in, produs, ',');
    std::getline(in, bucati, ',');
    std::getline(in, pret, ',');
    double total = std::stoi(bucati) * std::stod(pret);
    std::cout << produs << ": " << total << " lei\n";
}

Rezultat

Laptop: 7499.7 lei

Greșeli frecvente

  • Citești în int un câmp care conține și text (12kg): se citește 12, iar kg rămâne și strică citirea următoare.

Comenzi înrudite

  • std::stringstream: Flux care scrie și citește într-un șir din memorie; str() îi dă sau îi schimbă textul.
  • 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::stoi: Transformă un text în număr întreg (int, long, long long, unsigned long), cu excepții la erori.