std::getline
Megjelenés
Főnév
std::getline (tsz. std::getlines)
- (informatika)
std::getlineegy 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). Astd::getlineegyik 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.
Szintaxis
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 astd::stringváltozó, amelybe az olvasott sor kerül.delim: Opcionális határoló karakter (alapértelmezett:'\n').
Egyszerű példa
#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;
}
Működés
- A felhasználó beír egy teljes sort, és az
std::getlineelmenti azt asorváltozóba. - Az
std::getlineaz'\n'karakterig olvas. - Az eredményt kiírja a konzolra.
Egyéni határoló használata
#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;
}
Eredmény
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ák
Ha 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;
}
Fájl beolvasása 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;
}
Működés
- A program megnyit egy fájlt (
example.txt). std::getlinesoronként olvassa a fájl tartalmát.- Az eredményt kiírja a konzolra.
További hasznos példák
String stream feldolgozás
#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;
}
- Az
std::stringstreamegy stringet kezel úgy, mintha egy adatfolyam lenne. - Az
std::getline','határolót használva különálló részekre bontja.
Beolvasás és string manipuláció
#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;
}
- A felhasználó nevét olvassa be, majd átalakítja nagybetűssé.
Összegzés
- Egyszerű és hatékony: Az
std::getlinegyors módszer szöveg soronkénti beolvasására. - Határolók testreszabhatók: Nemcsak az
'\n', hanem más karakterek is használhatók határolóként. - Puffer problémák:
std::cin >>után mindig használjstd::cin.ignore()-t. - Fájlok feldolgozása:
std::ifstreamsegítségével egyszerűen olvashatunk fájlokat.
- std::getline - Szótár.net (en-hu)
- std::getline - Sztaki (en-hu)
- std::getline - Merriam–Webster
- std::getline - Cambridge
- std::getline - WordNet
- std::getline - Яндекс (en-ru)
- std::getline - Google (en-hu)
- std::getline - Wikidata
- std::getline - Wikipédia (angol)