Ugrás a tartalomhoz

std::stringstream

A Wikiszótárból, a nyitott szótárból
(stringstream szócikkből átirányítva)


Főnév

std::stringstream (tsz. std::stringstreams)

  1. (informatika) A C++ nyelvben a szöveges bemenetek és kimenetek kezelése nagyon fontos szerepet játszik. A std::stringstream egy olyan eszköz, amely lehetővé teszi, hogy a memóriában (nem fájlban, nem terminálon) szöveget olvassunk és írjunk egy stream (folyam) segítségével.

A std::stringstream a C++ standard könyvtárában található, a <sstream> fejlécben.

#include <sstream>

Alapötlet

A std::stringstream egy olyan objektum, amely:

  • úgy viselkedik, mint egy kimeneti stream (std::ostream): lehet bele <<-vel írni;
  • úgy viselkedik, mint egy bemeneti stream (std::istream): lehet belőle >>-vel olvasni;
  • a tartalma egy std::string;
  • a tartalmát bármikor ki lehet kérni str() metódussal.

Tehát gyakorlatilag a stringstream egy szöveges puffer, amivel úgy lehet dolgozni, mintha fájl vagy képernyő (vagy billentyűzet) lenne.



Miért hasznos?

  • Ha összerakunk egy szöveget több darabból (pl. riport generálás, logolás).
  • Ha szöveget kell elemezni (parszolni) pl. soronként, vagy szó szerint.
  • Ha adattípusokat alakítunk át stringgé és vissza.



Alapvető használat

1. Szöveg összerakása

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

int main() {
    std::stringstream ss;

    int a = 5;
    double b = 3.14;
    std::string c = "alma";

    ss << "Szamok: " << a << ", " << b << ", " << c << std::endl;

    std::cout << "Eredmeny: \n" << ss.str();  // kiíratás

    return 0;
}
  • Itt a stringstream úgy viselkedik, mint egy std::cout.
  • A str() függvény visszaadja a benne lévő teljes szöveget std::string-ként.



2. Szöveg beolvasása

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

int main() {
    std::string input = "123 4.56 alma";
    std::stringstream ss(input);

    int a;
    double b;
    std::string c;

    ss >> a >> b >> c;

    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;

    return 0;
}
  • Itt a stringstream úgy viselkedik, mint egy std::cin.
  • Beolvassa az adatokat a stringből típusok szerint.



Működés a gyakorlatban

Metódusok

Metódus Mit csinál
str() Kiolvassa vagy beállítja a teljes tartalmat
clear() Törli a hibajelző állapotokat
seekg() Olvasási pozíció beállítása
seekp() Írási pozíció beállítása



Példa: szám stringgé alakítása

int szam = 42;
std::stringstream ss;
ss << szam;
std::string eredmeny = ss.str();  // eredmeny == "42"

Példa: stringből számot olvasni

std::string s = "1234";
std::stringstream ss(s);
int szam;
ss >> szam;  // szam == 1234

Használati tippek

1. Logolás

Ha sok különböző típusú adatot akarsz egy stringgé gyűjteni, stringstream a legegyszerűbb eszköz:

std::stringstream ss;
ss << "Hiba kod: " << kod << ", uzenet: " << uzenet;
logger.log(ss.str());

2. Konverziók

  • Szám → string
  • String → szám

Ez akár modern C++-ban std::to_string-gel vagy std::stoi-val is lehet, de stringstream univerzális marad:

int a = 10;
std::stringstream ss;
ss << a;
std::string strA = ss.str();

ss.clear();  // állapot törlése új használat előtt
ss.str("123");
int b;
ss >> b;  // b == 123

Miért jobb mint sprintf?

Régi C-ben az ilyen szövegépítés sprintf-tel vagy snprintf-fel történt, ami:

  • bonyolult, mert formátum-stringet kell írni
  • könnyen vezet buffer overflow-hoz
  • nem típusbiztos

A stringstream típusbiztos és C++ stílusú.



Tipikus hibák

1️⃣ Nem hívod meg clear()-t újrahasználat előtt: ha a stream hibás állapotba kerül (pl. nem sikerült olvasás), akkor clear() kell a további műveletekhez.

2️⃣ Nem veszed ki a tartalmat .str()-rel: ha csak <<-t használsz, a stringbe beírja, de .str() nélkül nem látod.



Mikor ne használd?

  • Ha nagyon sok adathoz kell nagy sebesség → akkor jobb a std::ostringstream (csak írásra optimalizált).
  • Ha egyszerű konverzió kell → std::to_string vagy std::stoi stb.



stringstream alternatívák

  • std::ostringstream → csak kimenetre (<<)
  • std::istringstream → csak bemenetre (>>)
  • std::stringstream → mindkét irány



Példa: fájlhoz hasonló viselkedés

std::stringstream ss;
ss << "alma korte szilva";
std::string szo;

while (ss >> szo) {
    std::cout << "Szó: " << szo << std::endl;
}
  • Ugyanúgy lehet soronként, szavanként olvasni, mint std::cin-ből.



Összefoglalás

👉 A std::stringstream egy nagyon rugalmas eszköz C++-ban:

✅ stringet tudsz írni és olvasni, mintha fájl lenne ✅ adattípusokat lehet benne átalakítani ✅ stringből parsolni tudsz adatokat ✅ összetett szöveget lehet szépen felépíteni ✅ biztonságosabb, mint sprintf ✅ univerzális, nem kell formátum-string



Záró megjegyzés

A std::stringstream tipikusan logolásra, riportok generálására, adatkonverzióra, és parszolásra a leggyakrabban használt.

Mivel a stringstream egy szabványos stream API-t ad, minden C++ kódban alap eszköztárba tartozik.