Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140

    [C++] stream cin in stato di errore

    Salve a tutti ... qualcuno mi disse tempo fa che il seguente codice serve a "svuotare" lo stream cin in stato di errore:
    codice:
    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!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Qual'è il senso di svuotare qualcosa? Togliere il contenuto.
    Con quel ciclo togli il '\n' che può restare dopo un input errato.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    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?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    Forse ho qualche confusione sulla funzione get...
    codice:
    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....

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    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?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Lo stato d'errore (che è un flag interno) sì ... ma i caratteri vengono ripuliti dal buffer con la while ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    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?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.