Ce face std::getline
std::getline(std::cin, rand) citește caractere până la Enter ('\n') și le pune în rand, cu tot cu spații. Caracterul '\n' este consumat, dar nu este pus în șir.
Cu al treilea parametru, citirea se oprește la alt caracter: std::getline(flux, camp, ';') desparte un text de forma Iași;Cluj;Brașov. Funcționează cu orice flux: std::cin, un fișier sau un std::istringstream.
std::ws este un manipulator care sare peste toate spațiile albe (spații, tab, rânduri noi) de la începutul intrării. Se pune înainte de getline când înainte ai citit cu >>: std::getline(std::cin >> std::ws, nume);.
Parametri
| Parametru | Descriere |
|---|---|
flux |
Fluxul din care se citește: std::cin, un std::ifstream, un std::istringstream. |
rand |
Șirul în care se pune textul citit. Conținutul vechi este înlocuit. |
delimitator |
Opțional. Caracterul la care se oprește citirea; implicit '\n'. |
Ce returnează
Fluxul primit. Într-o condiție este fals când nu mai există nimic de citit, așa că while (std::getline(flux, rand)) parcurge toate rândurile.
Exemple
Exemplul 1: Citirea unui nume complet
#include <iostream>
#include <string>
int main() {
std::string nume;
std::getline(std::cin, nume);
std::cout << "Bun venit, " << nume << "!\n";
std::cout << "Numele are " << nume.size() << " caractere (cu spații).\n";
}
Ce scrie utilizatorul (intrare)
Ana Maria Popescu
Rezultat
Bun venit, Ana Maria Popescu!
Numele are 17 caractere (cu spații).
Exemplul 2: Problema după >> și rezolvarea cu std::ws
După std::cin >> varsta, Enter-ul rămâne în intrare. Primul getline îl găsește imediat și citește un rând gol. std::ws sare peste el.
#include <iostream>
#include <string>
int main() {
int varsta;
std::string oras;
std::cin >> varsta;
std::getline(std::cin, oras); // citește doar Enter-ul rămas
std::cout << "Fără ws: [" << oras << "]\n";
std::getline(std::cin >> std::ws, oras); // sare peste spațiile albe
std::cout << "Cu ws: [" << oras << "]\n";
}
Ce scrie utilizatorul (intrare)
21
Piatra Neamț
Rezultat
Fără ws: []
Cu ws: [Piatra Neamț]
Exemplul 3: Despărțirea unui text după ;
Cu un delimitator, getline citește câmp cu câmp dintr-un std::istringstream.
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::istringstream flux("Iași;Cluj-Napoca;Brașov;Timișoara");
std::string oras;
int nr = 1;
while (std::getline(flux, oras, ';')) {
std::cout << nr++ << ". " << oras << '\n';
}
}
Rezultat
1. Iași
2. Cluj-Napoca
3. Brașov
4. Timișoara
Greșeli frecvente
- Citești un număr cu
>>și apoi un rând cugetline, fărăstd::wssauignore: rândul citit este gol. - Scrii
std::cin.getline(nume)cu unstd::string. Metodacin.getlinelucrează cu tablourichar[]; pentrustd::stringse folosește funcția liberăstd::getline(std::cin, nume). - Pe Windows, fișierele pot avea rânduri terminate cu
\r\n. Citite pe Linux sau macOS, șirurile păstrează un'\r'la final, care strică comparațiile.
Comenzi înrudite
std::cin: Citește valori de la tastatură în variabile, cu operatorul >>.std::istringstream: Flux de citire dintr-un șir: desparte un text în cuvinte, numere sau câmpuri.std::istream::ignore: Sare peste caractere din intrare, de obicei până la sfârșitul rândului curent.std::ifstream: Deschide un fișier pentru citire și îl citește la fel ca pe std::cin.