std::istream::get în C++

Citește un singur caracter, inclusiv spații și rânduri noi; put scrie un caracter.

Sintaxă
int get();
std::istream& get(char& c);
std::ostream& put(char c);

Ce face std::istream::get

flux >> c sare peste spații. flux.get(c) citește următorul caracter oricare ar fi el: literă, spațiu, tab sau '\n'. Este felul de a citi un text caracter cu caracter, exact cum este.

Varianta fără argumente, get(), returnează caracterul ca int, sau EOF la final. Perechea pentru scriere este put(c), care scrie un caracter într-un flux de ieșire.

Atenție: un caracter cu diacritice, în UTF-8, înseamnă doi octeți, deci get îl citește din două bucăți.

Parametri

Parametru Descriere
c Variabila char în care se pune caracterul citit / caracterul de scris.

Ce returnează

get(c) și put(c) returnează fluxul; get() returnează caracterul sau EOF.

Exemple

Exemplul 1: Numărarea spațiilor și a rândurilor

#include <iostream>
#include <sstream>

int main() {
    std::istringstream text("Ana are mere.\nMihai are pere.\n");
    char c;
    int spatii = 0, randuri = 0, total = 0;
    while (text.get(c)) {
        ++total;
        if (c == ' ') ++spatii;
        if (c == '\n') ++randuri;
    }
    std::cout << total << " caractere, " << spatii << " spații, " << randuri << " rânduri\n";
}

Rezultat

30 caractere, 4 spații, 2 rânduri

Exemplul 2: Copiere caracter cu caracter, cu put

#include <iostream>
#include <sstream>

int main() {
    std::istringstream in("a-b-c");
    char c;
    while (in.get(c)) {
        std::cout.put(c == '-' ? '+' : c);
    }
    std::cout.put('\n');
}

Rezultat

a+b+c

Exemplul 3: Diacriticele sunt câte doi octeți

#include <iostream>
#include <sstream>

int main() {
    std::istringstream in("aș");
    int c;
    while ((c = in.get()) != EOF) {
        std::cout << c << ' ';
    }
    std::cout << '\n';
}

Rezultat

97 200 153

Greșeli frecvente

  • Stochezi rezultatul lui get() într-un char și compari cu EOF: pe unele platforme comparația nu funcționează. Folosește un int sau varianta get(c).

Comenzi înrudite

  • std::istream::peek: Arată următorul caracter din intrare fără să-l consume.
  • std::istream::ignore: Sare peste caractere din intrare, de obicei până la sfârșitul rândului curent.
  • std::getline: Citește un rând întreg, cu spații cu tot, într-un std::string.