std::getline în C++

Citește un rând întreg, cu spații cu tot, într-un std::string.

Sintaxă
#include <string>
std::istream& getline(std::istream& flux, std::string& rand);
std::istream& getline(std::istream& flux, std::string& rand, char delimitator);
flux >> std::ws;

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 cu getline, fără std::ws sau ignore: rândul citit este gol.
  • Scrii std::cin.getline(nume) cu un std::string. Metoda cin.getline lucrează cu tablouri char[]; pentru std::string se 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.