Question

Je suis moi-même en cours d'exécution à travers un livre de texte C ++ que j'ai un recyclage à la programmation C ++. L'un des problèmes de pratique (sans entrer dans trop de détails) me veut définir une fonction qui peut être transmis ifstream ou cin (par exemple istream) comme argument. A partir de là, je dois lire à travers le flux. Le problème est, je ne peux pas trouver un moyen d'avoir cette un Utilisation de la fonction cin et ifstream pour trouver efficacement la fin du flux. A savoir,

while(input_stream.peek() != EOF)

ne va pas travailler pour cin. Je pourrais retravailler la fonction de rechercher une certaine phrase (comme « #End Stream # » ou quelque chose), mais je pense que c'est une mauvaise idée si le flux de fichier je passe a cette expression exacte.

Je l'ai pensé à utiliser la surcharge de fonctions, mais jusqu'à présent, le livre a mentionné quand il veut le faire. Je mets sans doute trop d'effort dans ce seul problème de la pratique, mais je profiter du processus de création et je suis curieux de savoir s'il y a une telle façon de le faire sans surcharger.

Était-ce utile?

La solution

eof() fait travail pour cin. Vous faites quelque chose de mal; s'il vous plaît envoyer votre code. Un bloc d'achoppement commun est que le drapeau de eof se prépare après vous essayez de lire derrière la fin du flux.

Voici une démonstration:

#include <iostream>
#include <string>

int main( int, char*[] )
{
    std::string s;
    for ( unsigned n = 0; n < 5; ++n )
    {
        bool before = std::cin.eof();
        std::cin >> s;
        bool after = std::cin.eof();
        std::cout << int(before) << " " << int(after) << "  " << s << std::endl;
    }

    return 0;
}

et sa sortie:

D:>t
aaaaa
0 0  aaaaa
bbbbb
0 0  bbbbb
^Z
0 1  bbbbb
1 1  bbbbb
1 1  bbbbb

(EOF peut être généré avec Ctrl-Z sur Windows et Ctrl-D sur de nombreux autres systèmes d'exploitation)

Autres conseils

Pourquoi ne std::cin.eof() travail? cin sera EOF signaler quand stdin se ferme, ce qui se produira lorsque les signaux d'utilisateur avec Ctrl + d (* nix) ou Ctrl + z (Windows) , ou (dans le cas d'un flux d'entrée courante) lorsque les extrémités de fichiers passepoilées

Si vous utilisez un flux dans un contexte booléen alors il va se convertir en une valeur qui équivaut à vrai si elle n'a pas atteint le EOF et faux si une tentative a été faite pour lire après l'EOF (pas aussi false s'il y avait une erreur précédente lecture du flux).

Comme la plupart des opérations d'entrées-sorties sur les flux de retour du flux (ils peuvent être chaînés). Vous pouvez faire votre opération de lecture et utiliser le résultat du test (comme ci-dessus).

Ainsi, un programme pour lire un flux de nombres à partir d'un flux:

int main()
{
   int x;

   // Here we try and read a number from the stream.
   // If this fails (because of EOF or other error) an internal flag is set.
   // The stream is returned as the result of operator>>
   // So the stream is then being used in the boolean context of the while()
   // So it will be converted to true if operator>>  worked correctly.
   //                         or false if operator>> failed because of EOF
   while(std::cin >> x)
   {
       // The loop is only entered if operator>> worked correctly.
       std::cout << "Value: " << x << "\n";
   }

   // Exit when EOF (or other error).
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top