7
votes

Trouvez la fin du flux pour Cin & Ifstream?

Je suis moi-même dans un livre de texte C ++ que j'ai en tant que rafraîchissement de la programmation C ++. L'un des problèmes de pratique (sans faire trop de détails) veut que je définisse une fonction pouvant être transmise IFStream ou CIN (par exemple Istream) comme argument. De là, je dois lire dans le flux. Le problème est que je ne peux pas comprendre un moyen d'avoir cette une fonction em> Utiliser CIN et ifstream pour trouver efficacement la fin du flux. À savoir

while(input_stream.peek() != EOF)


1 commentaires

3 Réponses :


2
votes

Pourquoi std :: cin.eof () travail? CIN Signalera EOF lorsque STDIN se ferme, ce qui se fera lorsque l'utilisateur le signale avec Ctrl + D (* NIX) ou CTRL + Z ( Windows), ou (dans le cas d'un flux d'entrée de tuyauté) lorsque le fichier pipé se termine


3 commentaires

Sous Windows, il est ctrl + z , Ctrl + d est destiné aux systèmes basés sur UNIX.


Ah, cela fonctionne effectivement (bien Ctrl + Z pour Windows quand même). Désolé, s'il y a une petite confusion comme je l'avais à l'origine (! INPUT_STREAM.EOF ()) dans le poteau avant et édité-le à partir de (Input_stream.peek ()! = EOF). En tout cas, 1 préoccupation que j'ai sur l'utilisation tandis que (! INPUT_STREAM.EOF ()) est que lorsque la fonction lit le caractère EOF, le bit d'échec est défini pour INPUT_STREAM. Est-ce censé se produire?


@ user435219: Oui, car il n'a pas réussi à lire des données, car il a atteint le CEOF. Eof presque toujours des déclencheurs échouer aussi



6
votes

eof () code> fait strong> travail pour CIN. Vous faites quelque chose de mal; S'il vous plaît poster votre code. Un bloc d'achoppement commun est que EOF code> est défini après strong> vous essayez de lire derrière la fin du flux.

Voici une démonstration: P>

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


2 commentaires

Désolé pour la confusion, j'avais initialement tandis que (! Input_stream.eof ()), puis réalisé que j'avais écrit alors que (Input_stream.peek! = EOF) à la place. Quoi qu'il en soit, les deux méthodes fonctionnent avec le contrôle + Z (assez ironiquement, je ne faisais que lire sur le personnage de l'EOF de Wikipedia). Merci pour l'aide atzz, et tout le monde!


Préfère convertir le flux en un booléen sur .eof ou .bad .



2
votes

Si vous utilisez un flux dans un contexte booléen, il se convertira en une valeur équivalente à la vraie si elle n'a pas atteint l'EOF et false si une tentative a été apportée à la lecture de l'EOF (non pas FALSE s'il y avait une erreur précédente lecture du flux).

Étant donné que la plupart des opérations IO sur les flux renvoient le flux (afin qu'ils puissent être enchaînés). Vous pouvez faire votre opération de lecture et utiliser le résultat dans le test (comme ci-dessus). P>

Ainsi, un programme de lecture d'un flux de nombres à partir d'un flux: P>

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).
}


0 commentaires