PDA

Visualizza la versione completa : [C++] stream cin in stato di errore


mico
02-02-2010, 16:52
Salve a tutti ... qualcuno mi disse tempo fa che il seguente codice serve a "svuotare" lo stream cin in stato di errore:


char c;
cin.clear(); //resetta lo stream
while (cin.get(c) && c!='\n');

E' vera questa cosa?? Altrimenti a cosa serve il codice appena scritto? In realtà non ho neanche ben capito cosa si intende per svuotare lo stream...
Vi ringrazio antcipatamente! :ciauz:

shodan
02-02-2010, 18:16
Qual'è il senso di svuotare qualcosa? Togliere il contenuto.
Con quel ciclo togli il '\n' che può restare dopo un input errato.

MItaly
02-02-2010, 18:25
Originariamente inviato da shodan
Con quel ciclo togli il '\n' che può restare dopo un input errato.
... e tutti i caratteri errati che lo precedono.

mico
02-02-2010, 22:07
Grazie per la pazienza... purtroppo non riesco a capire perché while (cin.get(c) && c!='\n'); riesce a fare questo..... mi spiego meglio... con cin.get(c) non dovremmo essere noi a digitare nuovi caratteri per riempire lo stream con altri caratteri? :confused:

oregon
02-02-2010, 22:09
Originariamente inviato da mico
... non dovremmo essere noi a digitare nuovi caratteri ...

Sì, ma se ne digiti tanti, vanno in un buffer e la getc li preleva uno ad uno dal buffer ficnhe' non lo svuota ...

Quindi, se qualcuno ne ha pressato tanti e il buffer si è riempito, quel codice lo svuota ...

mico
02-02-2010, 22:24
Forse ho qualche confusione sulla funzione get... :confused:


int main() {
char c;
int i;
cin >> i;

if (!cin) cerr << "ERRORE" << endl;
cin.clear(); //resetta lo stream
while (cin.get(c) && c!='\n'); //svuota lo stream cin

cin>>i;
cout << i << endl;

system("PAUSE");
return 0;
}

io so che cin.get(c) si comporta allo stesso modo di cin >> c con la differenza (unica?) che get legge anche spazi bianchi..... Quindi compilando il codice io mi aspetto che quando arriviamo a while (cin.get(c) && c!='\n'); leggiamo una serie di caratteri finchè non digitiamo "a capo"... in questo modo i nuovi caratteri digitati vanno a riempire lo stream cin.... questo è ciò che mi aspetto ma evidentemente mi sbaglio....

oregon
02-02-2010, 22:29
Originariamente inviato da mico
Quindi compilando il codice io mi aspetto che quando arriviamo a while (cin.get(c) && c!='\n'); leggiamo una serie di caratteri finchè non digitiamo "a capo"...

Ok ... prova a pensare di avere digitato i caratteri e "a capo" prima che il while venga eseguito ... cosa succede?

mico
02-02-2010, 22:35
Se abbiamo digitato caratteri non consistenti con la variabile intera i lo stream si pone in uno stato di errore (che verra eliminatò grazie alla funzione clear() )... giusto?

oregon
02-02-2010, 22:42
Lo stato d'errore (che è un flag interno) sì ... ma i caratteri vengono ripuliti dal buffer con la while ...

mico
02-02-2010, 22:55
Ok sullo stato di errore ci sono... il problema rimane sempre capire quel maledetto while..
... ma i caratteri vengono ripuliti dal buffer con la while ...
con cin.get(c) io dovrei leggere ALTRI caratteri da tastiera.... (che però compilando il codice vedo che non succede)..... perchè non vengono letti questi altri caratteri? Non mi è chiaro il funzionamento della get?

Loading