Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [c++] problema con EOF

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36

    [c++] problema con EOF

    Sto leggendo il libro di deitel e questo programma sfrutta il costrutto di selezione switch.Il programma dovrebbe contare il numero di voti differenti assegnati durante un esame.

    Ecco il codice:

    codice:
    #include <iostream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    int main()
    {
       int grade,       
           aCount = 0, 
           bCount = 0,  
           cCount = 0,  
           dCount = 0, 
           fCount = 0;  
    
       cout << "Enter the letter grades." << endl
            << "Enter the EOF character to end input." << endl;
    
       while ( ( grade = cin.get() ) != EOF ) {
    
          switch ( grade ) {      
    
             case 'A':  
             case 'a': 
                ++aCount;         
                break; 
    
             case 'B': 
             case 'b':   
               ++bCount;         
                break;
    
             case 'C':  
             case 'c':  
                ++cCount;         
                break;
    
             case 'D':  
             case 'd':  
                ++dCount;         
                break;
    
             case 'F':  
             case 'f': 
                ++fCount;         
                break;
    
             case '\n':  
             case '\t':
             case ' ':  
               break;
    
             default:  
                cout << "Incorrect letter grade entered."
                     << " Enter a new grade." << endl;
                break;
          }
       }
    
       cout << "\n\nTotals for each letter grade are:" 
            << "\nA: " << aCount 
            << "\nB: " << bCount 
            << "\nC: " << cCount 
            << "\nD: " << dCount
            << "\nF: " << fCount << endl;
    
       return 0;
    }

    Il problema è questo, quando vado ad eseguire, il compilatore mi dice che EOF was not declared in this scope.Non capisco cosa dovrei assegnare ad eof che dovrebbe essere l'end of system di "defalut", o sbaglio?in windows dovrebbe coincidere con ctrl-z, ma anche utilizzando una variabile qualsiasi al posto di EOF e digitanto poi ctrl-z, il costrutto switch non termina per poi procedere quindi con il cout dei voti.Sapreste aiutarmi?

  2. #2
    "EOF" non è un vero carattere - è semplicemente un modo con cui la funzione C fgetc segnala che lo stream di input è terminato; cin.get() non restituisce EOF quando il file è terminato.
    cin (e in generale gli stream C++ derivati da std::istream) usa un modo diverso per segnalare che si è raggiunta la fine del file: imposta il "bit di EOF" dello stream, che puoi controllare usando il metodo cin.eof(); la tua condizione diventa quindi:
    codice:
    while ( ( grade = cin.get() ), !cin.eof() ) {
    (l'operatore virgola scarta esegue l'espressione a sinistra e ne scarta il risultato; in questa maniera, si può effettuare il controllo di eof subito dopo aver tentato la lettura)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36
    Originariamente inviato da MItaly
    "EOF" non è un vero carattere - è semplicemente un modo con cui la funzione C fgetc segnala che lo stream di input è terminato; cin.get() non restituisce EOF quando il file è terminato.
    cin (e in generale gli stream C++ derivati da std::istream) usa un modo diverso per segnalare che si è raggiunta la fine del file: imposta il "bit di EOF" dello stream, che puoi controllare usando il metodo cin.eof(); la tua condizione diventa quindi:
    codice:
    while ( ( grade = cin.get() ), !cin.eof() ) {
    (l'operatore virgola scarta esegue l'espressione a sinistra e ne scarta il risultato; in questa maniera, si può effettuare il controllo di eof subito dopo aver tentato la lettura)
    grazie mille, anche se non capisco come sia possibile che il codice del libro sia sbagliato.

  4. #4
    Originariamente inviato da aleye
    grazie mille, anche se non capisco come sia possibile che il codice del libro sia sbagliato.
    In effetti faceva strano anche a me, e infatti la documentazione che avevo guardato (su cplusplus.com) era sbagliata (e dire che lo so che è pieno di bachi quel sito... ); controllando sullo Standard (o su siti più affidabili come cppreference.com) ho visto che effettivamente in caso di fine stream cin.get() restituisce std::istream::traits_type::eof(); per cui puoi scrivere:
    codice:
       while ( ( grade = cin.get() ) != std::istream::traits_type::eof() )
    Ora, std::istream::traits_type è std::char_traits<char>, e lo standard dice che std::char_traits<char>::eof() restituisce EOF (definita in <cstdio>); dunque puoi anche scrivere
    codice:
       while ( ( grade = cin.get() ) != EOF )
    come nel tuo codice originale, a patto di includere prima <cstdio>.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    36
    Originariamente inviato da MItaly
    In effetti faceva strano anche a me, e infatti la documentazione che avevo guardato (su cplusplus.com) era sbagliata (e dire che lo so che è pieno di bachi quel sito... ); controllando sullo Standard (o su siti più affidabili come cppreference.com) ho visto che effettivamente in caso di fine stream cin.get() restituisce std::istream::traits_type::eof(); per cui puoi scrivere:
    codice:
       while ( ( grade = cin.get() ) != std::istream::traits_type::eof() )
    Ora, std::istream::traits_type è std::char_traits<char>, e lo standard dice che std::char_traits<char>::eof() restituisce EOF (definita in <cstdio>); dunque puoi anche scrivere
    codice:
       while ( ( grade = cin.get() ) != EOF )
    come nel tuo codice originale, a patto di includere prima <cstdio>.
    grazie milel.

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.