Il controllo di cin.eof () è davvero necessario?

4

Ho scritto un semplice programma che legge l'input di caratteri dalla tastiera all'interno di un ciclo For. Il mio professore ha tolto 10 punti per non aver controllato l'input usando cin.eof. Non capisco perché sia necessario? Presumibilmente qualsiasi carattere non intero dovrebbe essere accettabile. Il prof ha detto in particolare di non controllare gli interi.

Ho eseguito il programma utilizzando Visual Studio 10 e inserito CTRL-Z come input. Il programma si chiude comunque anche se non ho fatto un codice specifico per la condizione EOF. Qualcuno può spiegare perché? Ed è giusto che il professore insista per controllare cin.eof o sia questo stile antiquato?

Ecco un esempio di snippet di codice:

cout << "Enter a list of 10 words" << endl;

for (i= 0;i< MAX; i++) { 
    getline(cin, input);
    Word word(input);
    noun_array[nElements]= word;
} 
    
posta astra 14.10.2014 - 16:01
fonte

1 risposta

7

I ran the program using Visual Studio 10, and entered CTRL-Z as input. The program quit anyway even though I did not specifically code for the EOF condition. Can someone explain why?

Il programma non si chiude.

Il carattere di fine file ( CTRL - Z sulla tastiera) imposta il flag di stato interno di std::cin su eofbit , che deve essere cancellato con basic_ios: clear () prima di seguire le chiamate a getline funzionerà correttamente.

Il ciclo viene eseguito MAX volte ma getline non aggiungerà caratteri a input .

Non sono sicuro che questo sia ciò che desideri. Se funziona, è probabilmente una questione di fortuna.

Come verificare? eof() ha alcuni aspetti negativi:

Both eof() and feof() check the state of an input stream to see if an end-of-file condition has occurred. Such a condition can only occur following an attempted read operation. If you call either function without previously performing a read, your code is wrong! Never loop on an eof function.

(da Tutto su EOF )

Lo stato EOF potrebbe non essere impostato fino a quando non viene tentata una lettura oltre la fine del file. Cioè, la lettura dell'ultimo byte da un file potrebbe non impostare lo stato EOF.

Inoltre

if (!std::cin.eof())

verificherà la fine del file, non gli errori.

Dovresti preferire:

if (getline(std::cin, input))
{
  // ...
}

Vedi anche Domande frequenti su C ++ sezione 15.5 e Come determinare se si tratta di EOF quando si utilizza getline () in c ++?

Modifica

Dovrebbe essere qualcosa del tipo:

std::cout << "Enter a list of 10 words" << std::endl;

for (unsigned i(0); i < MAX && std::getline(std::cin, input); ++i)
{
  // ...
  // Word word(input);
  // noun_array[nElements] = word;
  // ...
}

In questo modo il programma esegue la sua elaborazione solo con un input valido.

    
risposta data 14.10.2014 - 17:43
fonte

Leggi altre domande sui tag