2010-07-01 5 views
1

J'utilise le code suivant:cin.get() ne reçoit pas de boucle

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

int main() 
{ 
    char c ; 
    c = cin.get() ; 
    do { 
     cout.put(c) ; 

     c = cin.get() ; 
    } while (!cin.eof()) ; 

    cout << "coming out!" << endl; 
    return 0; 
} 

Problème avec le code ci-dessus est, ce ne est pas sortir de la boucle, ce qui signifie son pas l'impression « coming out ". Quelqu'un peut-il aider pourquoi? Je suis en train de tester ce programme sur Mac et Linux.

Merci

Répondre

2

La norme ne touche jamais EOF, sauf si vous appuyez sur Ctrl + Z.

Par conséquent, cin.eof() est toujours faux.

Pour résoudre ce problème, appuyez sur Ctrl + Z pour envoyer un caractère de fin de fichier.
Vous pouvez également modifier la condition. (Par exemple, while(c != '\n'))

+0

Bien que votre réponse alors que (c! = '\ N') fonctionne sur le terminal, mais il est bloqué quand j'essaye de donner l'entrée using le dossier. Merci quand même. – itsaboutcode

+0

Ajoutez '&&! Cin.eof()'. – SLaks

+0

Vous êtes un grand homme! – itsaboutcode

1

Vous devez appuyer sur CTRL-Z pour simuler EOF (fin de fichier) et de sortir de la boucle.

Si vous n'appuyez pas sur CTRL-Z, la boucle continuera à fonctionner indéfiniment.

+0

Ou CTRL-D sur des plates-formes non-Microsoft. – sepp2k

5

Il imprime "coming out" à condition qu'il obtienne la fin du fichier. Il va sortir de la boucle si vous redirigez un fichier avec

./program < file 

ou d'envoyer la fin de fichier vous, en appuyant sur Ctrl + d (linux) ou ctrl + z (dos)

+0

Eh bien, si j'utilise la commande suivante pour l'exécuter, elle en est sortie. ./main < input.txt > output.txt. Mais y at-il de toute façon si je peux donner une entrée sur l'invite de commande? Merci – itsaboutcode

+0

Si je frappe ctrl + d (linux), son impression pas "coming out" – itsaboutcode

+0

Comme d'autres l'ont mentionné (pour DOS/Windows) et je viens d'ajouter, vous pouvez toujours dire au programme lorsque vous finissez de transmettre des informations –

1

Fonctionne parfaitement bien ici :) Si vous exécutez cela dans un terminal, vous devez envoyer EOF à ce terminal. Sur * nix, ce serait Control + D. Je ne peux malheureusement rien dire sur Windows. Edit: Comme d'autres l'ont souligné: Ctrl + Z serait le moyen Windows d'envoyer EOF.

0

Je vais faire une supposition à propos de l'intention, car il n'y a rien de mal avec ce code mais ce n'est probablement pas ce que vous vouliez, et vous suggérerez aussi une boucle while uhhh .. pendant que je suis là.

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

bool is_terminator(char ch) 
{ 
    return ch != '\n' && ch != '\r'; 
} 

int main() 
{ 
    char ch; 
    while (cin.get(ch) && !is_terminator(ch)) 
     cout.put(ch); 

    cout << "coming out!" << endl; 
} 
Questions connexes