std::stringstream
Főnév
std::stringstream (tsz. std::stringstreams)
- (informatika) A C++ nyelvben a szöveges bemenetek és kimenetek kezelése nagyon fontos szerepet játszik. A
std::stringstreamegy 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 egystd::cout. - A
str()függvény visszaadja a benne lévő teljes szövegetstd::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 egystd::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_stringvagystd::stoistb.
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.
- std::stringstream - Szótár.net (en-hu)
- std::stringstream - Sztaki (en-hu)
- std::stringstream - Merriam–Webster
- std::stringstream - Cambridge
- std::stringstream - WordNet
- std::stringstream - Яндекс (en-ru)
- std::stringstream - Google (en-hu)
- std::stringstream - Wikidata
- std::stringstream - Wikipédia (angol)