2016-05-31 1 views
0

Ce qui suit est mon code, que je veux lire les caractères de stdin, et se termine quand il rencontre un EOF (ctrl-z) .C + + utilise cin.get pour obtenir un caractère, mais ne termine pas la boucle while lorsque vous rencontrez l'EOF

#include<iostream> 
#include<fstream> 
#include<stdio.h> 
#include<string> 
using namespace std; 

int main() 
{ 
    string article ;  
    char nextChar; 
    while(cin.get(nextChar)) { 
     if(cin.eof()) break ; 
     article.append(1, nextChar) ; 
    } 

    cout << article ; 

    system("pause") ; 
} 

Je test comme une entrée ceci:

I am a student.<ctrl-z> 

Et puis je puis appuyez sur Entrée, mais il n'arrête pas.

Lorsque je tape un autre [Ctrl-z], puis appuyez sur neter.

Il peut juste sortir de la boucle while.

Pourquoi le premier [ctrl-z] à ne pas signaler la condition eof?

+0

Essayez 'Ctrl-D' pour' EOF'. ('Ctrl-Z' est souvent" pause le processus "). – Galik

+0

@Galik: C'est très spécifique à l'environnement. ASCII 26 est un marqueur EOF, mais les terminaux sur les systèmes d'exploitation autres que Windows ne génèrent généralement pas d'ASCII 26 lorsque vous appuyez sur Ctrl + Z. –

Répondre

1

L'explication suivante est légèrement simplifiée.

C'est une caractéristique de votre système d'exploitation. C'est ainsi que fonctionne votre système d'exploitation.

Une fin de fichier est, en réalité, l'appel système read() sous-jacent retournant 0. Une fin de fichier n'est pas CTRL-Z. CTRL-Z est interprété par votre système d'exploitation pour vider son tampon de clé interactive, et avoir le read() son contenu.

Lorsque vous tapez un terminal, le processus ne finit pas réellement de lire quoi que ce soit tant que vous n'appuyez pas sur Enter. À ce moment, l'appel système read() se termine et renvoie tout ce qui a été lu. En général, avant d'appuyer sur Enter vous pouvez reculer et modifier ce que vous avez tapé, et votre programme n'a aucune indication que vous avez édité quoi que ce soit, tout ce qu'il read() s est le contenu final de la ligne après avoir appuyé sur Enter.

Si vous tapez quelque chose, et appuyez sur CTRL-Z, l'entrée typée est également read() par le programme comme si elle était entré.

Seulement si rien est typé, et CTRL-Z est pressé, ce que le read() sous-jacente l'appel système renvoie 0, car rien n'a été tapé en premier; ceci est interprété comme une indication de fin de fichier. Mais si quelque chose est tapé dans la première, CTRL-Z doit être entré deux fois, une fois pour read() la dactylographiées en entrée, et vider la mémoire tampon d'entrée, puis CTRL-Z une seconde fois, pour provoquer une read() de 0.

Par façon, votre code a un bug inoffensif. Si cin.get() réussit, cin.eof() ne peut jamais être vrai.