std::getline (tsz. std::getlines)
std::getline
egy C++ függvény, amelyet szöveges adatok beolvasására használnak egy bemeneti folyamról (std::istream
), például egy fájlból (std::ifstream
) vagy a standard bemenetről (std::cin
). A std::getline
egyik legfőbb előnye, hogy egy teljes sort olvas be, és nem áll meg szóköznél, ellentétben az operátorral (>>
), amely szóközöknél vagy új soroknál megáll.
std::getline(std::istream& is, std::string& str);
std::getline(std::istream& is, std::string& str, char delim);
is
: A bemeneti adatfolyam (std::cin
, std::ifstream
, stb.).str
: Az a std::string
változó, amelybe az olvasott sor kerül.delim
: Opcionális határoló karakter (alapértelmezett: '\n'
).
#include <iostream>
#include <string>
int main() {
std::string sor;
std::cout << "Adj meg egy sort: ";
std::getline(std::cin, sor);
std::cout << "Beolvasott sor: " << sor << std::endl;
return 0;
}
std::getline
elmenti azt a sor
változóba.std::getline
az '\n'
karakterig olvas.
#include <iostream>
#include <string>
int main() {
std::string adat;
std::cout << "Adj meg egy adatot (':' karakter választja el a végétől): ";
std::getline(std::cin, adat, ':');
std::cout << "Beolvasott adat: " << adat << std::endl;
return 0;
}
Ha a bemenet:
Ez egy példa: további szöveg
akkor a kimenet:
Beolvasott adat: Ez egy példa
Mivel az ':'
karakter volt a határoló, az utána következő rész (" további szöveg"
) kimarad.
std::getline
és std::cin
problémákHa előtte egy std::cin >>
műveletet használunk, például egy számot olvasunk be, problémák léphetnek fel:
#include <iostream>
#include <string>
int main() {
int szam;
std::string sor;
std::cout << "Adj meg egy számot: ";
std::cin >> szam;
std::cout << "Adj meg egy sort: ";
std::getline(std::cin, sor);
std::cout << "Szám: " << szam << std::endl;
std::cout << "Sor: " << sor << std::endl;
return 0;
}
Probléma: Az std::cin >> szam;
után marad egy '\n'
a bemeneti pufferben, amit az std::getline
rögtön beolvas egy üres sor formájában.
Megoldás:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Használjuk az ignore
-t, hogy kiürítsük a maradék új sort:
#include <iostream>
#include <string>
#include <limits>
int main() {
int szam;
std::string sor;
std::cout << "Adj meg egy számot: ";
std::cin >> szam;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Adj meg egy sort: ";
std::getline(std::cin, sor);
std::cout << "Szám: " << szam << std::endl;
std::cout << "Sor: " << sor << std::endl;
return 0;
}
std::getline
segítségével#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream file("example.txt");
std::string line;
if (file.is_open()) {
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
file.close();
} else {
std::cerr << "Nem sikerült megnyitni a fájlt!" << std::endl;
}
return 0;
}
example.txt
).std::getline
soronként olvassa a fájl tartalmát.
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string adat = "Egy,két,három,négy";
std::stringstream ss(adat);
std::string resz;
while (std::getline(ss, resz, ',')) {
std::cout << resz << std::endl;
}
return 0;
}
std::stringstream
egy stringet kezel úgy, mintha egy adatfolyam lenne.std::getline
','
határolót használva különálló részekre bontja.
#include <iostream>
#include <string>
int main() {
std::string nev;
std::cout << "Írd be a teljes neved: ";
std::getline(std::cin, nev);
std::cout << "A neved nagybetűkkel: ";
for (char& c : nev) {
c = std::toupper(c);
}
std::cout << nev << std::endl;
return 0;
}
std::getline
gyors módszer szöveg soronkénti beolvasására.'\n'
, hanem más karakterek is használhatók határolóként.std::cin >>
után mindig használj std::cin.ignore()
-t.std::ifstream
segítségével egyszerűen olvashatunk fájlokat.