Ce face std::istream::peek
peek() se uită la următorul caracter, dar îl lasă în flux: următoarea citire îl va găsi tot acolo. Este util când trebuie să decizi cum citești mai departe, de exemplu dacă urmează un număr sau un cuvânt.
Returnează caracterul ca int, sau EOF dacă nu mai există date.
Ce returnează
Codul următorului caracter, sau EOF.
Exemple
Exemplul 1: Număr sau cuvânt?
#include <cctype>
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::istringstream in("12 mere 7 pere 3");
while (in >> std::ws && in.peek() != EOF) {
if (std::isdigit(in.peek())) {
int n;
in >> n;
std::cout << "număr: " << n << '\n';
} else {
std::string cuvant;
in >> cuvant;
std::cout << "cuvânt: " << cuvant << '\n';
}
}
}
Rezultat
număr: 12
cuvânt: mere
număr: 7
cuvânt: pere
număr: 3
Exemplul 2: Ignorarea comentariilor dintr-un fișier de setări
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
int main() {
std::istringstream setari("# setări\noras Iași\n# limba\nlimba ro\n");
std::string cheie, valoare;
while (setari.peek() != EOF) {
if (setari.peek() == '#') {
setari.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
continue;
}
setari >> cheie >> valoare >> std::ws;
std::cout << cheie << " = " << valoare << '\n';
}
}
Rezultat
oras = Iași
limba = ro
Greșeli frecvente
- Crezi că
peekavansează în flux și ajungi într-o buclă infinită, citind mereu același caracter.
Comenzi înrudite
std::istream::get: Citește un singur caracter, inclusiv spații și rânduri noi; put scrie un caracter.std::istream::ignore: Sare peste caractere din intrare, de obicei până la sfârșitul rândului curent.std::isalpha: Verifică tipul unui caracter: literă, cifră, spațiu, majusculă, minusculă sau punctuație.