2016-09-13 2 views
1

Compte tenu du programme suivantlecture jusqu'à nouvelle ligne en C++ va dans une boucle infinie

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    int integer; 
    cin >> integer; 
    if (!cin) { 
     string str; 
     char ch; 
     while ((ch = cin.get()) != '\n') { 
      cout << "scanning" << endl; 
      cout << "got " << static_cast<int>(ch) << endl; 
     } 
    } 
    return 0; 
} 

Administrée ce fichier d'entrée (entrée redirigée)

x123 

Avec une nouvelle ligne à la fin, pourquoi le programme entre-t-il dans une boucle infinie? Ne devrait-il pas s'arrêter après avoir rencontré la nouvelle ligne à la fin du fichier? Je continue à obtenir la valeur de ch récupéré comme -1 ..

Merci!

Remarquecin.ignore() ne semble pas aider à résoudre le problème ici

+0

C'est le cas, et puis quand je scanne jusqu'à la fin pour essayer de trouver une nouvelle ligne, je reçois une boucle infinie – Curious

+0

que j'ai ajouté dans un retour à la ligne manuellement. C'est là – Curious

+0

Vais-je 'cin.ignore()'? Nope n'aide pas – Curious

Répondre

3

Si vous obtenez une erreur sur std::cin (qui est de type std::istream), alors vous devez effacer:

int integer; 
cin >> integer; 
if (!cin) { 
    cin.clear(); // If an error occurred, we need to clear it! 
    ... 

Puis

+0

non! ça arrête seulement la boucle infinie mais rien de correct! – Raindrop7

+0

try {cintre> entier; if (cin.fail()) jette;} catch (...) {cout << "cin jette cette exception!" << endl;} – Raindrop7

1

La solution consiste à récupérer de l'état défaillant avec cin.clear(), puis réessayez de numériser ti Il y a une nouvelle ligne ..