Trouver la fin de stream pour les cin & ifstream?
Je suis moi-même par le biais d'un C++ texte livre que j'ai qu'une remise à niveau pour la programmation en C++. L'un des exemples de problèmes (sans trop entrer dans les détails) me veut définir une fonction qui peut être transmise ifstream ou cin (par exemple istream) comme argument. À partir de là, j'ai à lire le flux. La difficulté est, je ne peux pas trouver un moyen d'avoir cette un fonction de l'utilisation cin et ifstream pour trouver efficacement la fin du flux. À savoir,
while(input_stream.peek() != EOF)
n'est pas d'aller travailler pour cin. J'ai pu retravailler la fonction pour chercher une certaine expression (comme "#Fin de Stream#" ou quelque chose), mais je pense que c'est une mauvaise idée si le flux de fichier je passe a cette phrase exacte.
J'ai pensé à utiliser la fonction de surcharge, mais jusqu'à présent, le livre a mentionné quand il veut de moi. Je suis probablement mettre trop d'effort dans ce un problème pratique, mais j'aime bien le processus créatif et je suis curieux de savoir si il y a une façon de le faire sans surcharge.
OriginalL'auteur user435219 | 2010-08-30
Vous devez vous connecter pour publier un commentaire.
eof()
ne travail pour cin. Vous faites quelque chose de mal; merci de poster votre code. Une commune de la pierre d'achoppement est queeof
drapeau est après vous essayez de lire derrière la fin du cours d'eau.Voici une démonstration:
et sa sortie:
(Expressions du FOLKLORE peuvent être générés avec Ctrl-Z sur Windows et Ctrl-D sur de nombreux autres Systèmes d'exploitation)
Préférez la conversion du flux pour une booléenne plus
.eof
ou.bad
.OriginalL'auteur atzz
Pourquoi ne pas
std::cin.eof()
travail?cin
sera le signal de EOF lors de l'entrée standard stdin ferme, ce qui se produit lorsque l'utilisateur des signaux avec Ctrl+d (*nix) ou Ctrl+z (Windows), ou (dans le cas d'une canalisation du flux d'entrée) lorsque les canalisations de fichier se termineCtrl+Z
,Ctrl+D
est pour les systèmes basés sur UNIX.Oh, bon point; ajouté que, dans
Ah, ça fonctionne en effet (bien Ctrl + Z pour windows en tout cas). Désolé, si il y a un peu de confusion que j'ai d'abord eu while(!input_stream.eof()) dans le post avant et modifié à tout(input_stream.peek() != EOF). En tout cas, 1 préoccupation que j'ai, sur l'utilisation de while(!input_stream.eof ()), c'est que lorsque la fonction lit le caractère EOF l'échec bit est défini pour input_stream. Est-ce censé arriver?
oui, parce qu'il n'a pas pu lire les données, car il a atteint les expressions du FOLKLORE. EOF provoque presque toujours
fail
ainsiOriginalL'auteur Michael Mrozek
Si vous utilisez un flux de données dans un contexte booléen, alors il va se convertir en une valeur qui est équivalent à true si elle n'a pas atteint les expressions du FOLKLORE, et false si une tentative a été faite pour lire au-delà des expressions du FOLKLORE (non c'est faux lui aussi si il y a eu un erreur de lecture du flux de données).
Puisque la plupart des opérations d'e /s sur les cours d'eau de retour du flux (de sorte qu'ils peuvent être enchaînés). Vous pouvez faire votre opération de lecture et d'utiliser le résultat du test (comme ci-dessus).
Donc un programme pour lire un flux de nombres à partir d'un flux:
OriginalL'auteur Martin York