web-dev-qa-db-fra.com

Bonne façon d'utiliser cin.fail ()

Quelle est la bonne façon d'utiliser cin.fail();?

Je fais un programme où vous devez saisir quelque chose. Il n'est pas très clair si vous devez saisir un nombre ou un caractère. Lorsqu'un utilisateur entre un caractère au lieu d'un nombre, la console devient folle. Comment puis-je utiliser cin.fail() pour résoudre ce problème?

Ou existe-t-il une meilleure façon?

16
user2630617

cin.fail() renvoie vrai si la dernière commande cin a échoué, et faux sinon.

Un exemple:

int main() {
  int i, j = 0;

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}

Supposons maintenant que vous ayez un fichier texte - input.txt et que son contenu soit:

  30 40 50 60 70 -100 Fred 99 88 77 66

Lorsque vous exécuterez un programme court au-dessus, cela résultera comme:

  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100

il ne continuera pas après la 6e valeur car il se ferme après avoir lu la septième Word, car ce n'est pas un entier: cin.fail() renvoie true.

8
Shumail

std::cin.fail() est utilisé pour tester si l'entrée précédente a réussi. Il est cependant plus idiomatique d'utiliser simplement le flux comme s'il s'agissait d'un booléen:

if ( std::cin ) {
    //  last input succeeded, i.e. !std::cin.fail()
}

if ( !std::cin ) {
    //  last input failed, i.e. std::cin.fail()
}

Dans les contextes où la syntaxe de l'entrée autorise soit un nombre d'un caractère, la solution habituelle est de le lire par des lignes (ou sous une autre forme de chaîne), et de l'analyser; lorsque vous détectez qu'il existe un nombre, vous pouvez utiliser un std::istringstream pour le convertir, ou n'importe quel nombre d'autres alternatives (strtol, ou std::stoi si vous avez C++ 11).

Il est cependant possible d'extraire les données directement du flux:

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}
17
James Kanze