Syntaxiquement correct, oui. Mais pas logiquement. Vous utilisez incorrectement eof()
.
La première chose à réaliser est que tous les des fonctions dont testent le statut de leurs résultats sur la dernière entrée. Et vous devez toujours vérifier que l'entrée a réussi avant d'utiliser quoi que ce soit que vous avez entré; lorsque vous écrivez:
inFile >> grades;
std::cout << grades;
vous n'êtes pas vérifier que l'entrée a réussi avant classes accès. Dans ce cas, si l'entrée échoue, vous obtenez la valeur précédente ; s'il n'y avait pas de valeur précédente, vous obtenez un comportement non défini. Quelque part entre le >>
et le <<
, vous devez vérifier que le >>
a réussi.
La méthode habituelle de vérification du succès consiste à utiliser le flux lui-même comme un booléen. Et parce que le >>
renvoie une référence au courant, la façon idiomatiques d'écrire votre boucle serait:
while (inFile >> grades) {
std::cout << grades << std::endl;
}
D'un point de vue, il est horrible génie logiciel (modification de l'état dans l'état d'un while
) , mais l'idiome est si omniprésent que toute autre question soulève des questions.
Ceci s'arrêtera s'il y a une erreur de saisie pour une raison quelconque. Une fois que vous avez vu l'échec (et alors seulement), vous pouvez demander pourquoi:
if (inFile.bad()) {
// Serious hardware failure...
} else if (!inFile.eof()) {
// Format error in the input...
} else {
// Normally, no more data in the input stream, but
// there are a few special cases where you could still
// have a format error and end up here. Not with
// `int`, however.
}
Mais encore une fois, cela est seulement valide après une entrée a échoué.
des dizaines de messages déjà sur SO, s'il vous plaît faire une petite recherche – P0W
'while (inFile >> grades)' – BoBTFish
Encore une fois: ** Ne pas utiliser 'while (! InFile.eof())'. N'utilisez pas 'while (inFile.good())'. ** Voir [Pourquoi iostream :: eof est-il dans une condition de boucle considérée comme incorrecte?] (Http://stackoverflow.com/questions/5605125/why-is -iostreameof-inside-a-loop-condition-considered-wrong) –