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.