begin process at 2012 05 27 18:05:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > RÉCUPÉRER D'UNE ERREUR DE LECTURE SUR UN FLUX

RÉCUPÉRER D'UNE ERREUR DE LECTURE SUR UN FLUX


 Information sur la source

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caractères Classé sous :cinfail, cinignore, cinclear, cin Niveau :Initié Date de création :27/01/2006 Vu :4 796

Auteur : lacousine

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Le langage C++, comme la plupart des langages de programmation contemporains, permet de lire et d'écrire de et sur des flux de données, ce qui lui permet d'abstraire les accès aux périphériques comme le clavier, la souris ou un écran console de la même manière que celle utilisée pour abstraire l'accès à un fichier.

Le flux en entrée le plus typique avec C++, surtout en début de formation, est l'objet permettant l'asbtraction de l'entrée standard et nommé std::cin. Cette rubrique utilisera std::cin comme référence mais pourrait s'appliquer à tout dérivé de std::istream (si cette dernière phrase ne vous dit rien, ce n'est sans doute qu'une question de temps).

Si on désire reprendre la lecture tant et aussi longtemps qu'une valeur à la fois valide et située entre les bornes n'aura pas été saisie, il faudra remettre le flux en entrée sur ses pattes à chaque erreur. En effet, une entrée intraduisible sur un flux d'entrée a deux conséquences:

elle met le flux en étant d'échec (la méthode fail() retourne true); et
le contenu impossible à traduire reste coincé dans le flux (au cas où on en aurait besoin).
Si on veut lire un entier, comme c'est le cas dans notre exemple, et si le contenu de std::cin est impossible à traduire en entier, alors:

il faut oublier l'échec lors de la traduction, ce qu'on fait en sollicitant la méthode clear() du flux; et
il faut vider le flux des données intraduisibles avant de poursuivre--ou, en d'autres termes, ignorer ce qui y traîne encore, à l'aide de la méthode ignore() du flux.


Source

  • #include <iostream> // std::cin, std::cout, std::endl
  • int main ()
  • {
  • const int BORNE_MIN = 1,
  • BORNE_MAX = 10;
  • std::cout << "Entrez un entier se situant entre "
  • << BORNE_MIN
  • << " et "
  • << BORNE_MAX
  • << " inclusivement. Votre choix: ";
  • int ValeurLue;
  • while (!(std::cin >> ValeurLue) || ValeurLue < BORNE_MIN || ValeurLue > BORNE_MAX)
  • {
  • std::cin.clear (); // on oublie l'échec et on poursuit
  • std::cin.ignore (); // ignorer le contenu déjà lu
  • std::cout << "Erreur. Je veux un entier se situant entre "
  • << BORNE_MIN
  • << " et "
  • << BORNE_MAX
  • << " inclusivement. Votre choix: ";
  • }
  • std::cout << "La valeur choisie est: "
  • << ValeurLue
  • << "; merci!"
  • << std::endl;
  • }
#include <iostream> // std::cin, std::cout, std::endl

int main ()
{
   const int BORNE_MIN = 1,
             BORNE_MAX = 10;
   std::cout << "Entrez un entier se situant entre "
             << BORNE_MIN
             << " et "
             << BORNE_MAX
             << " inclusivement. Votre choix: ";
   int ValeurLue;
   while (!(std::cin >> ValeurLue) || ValeurLue < BORNE_MIN || ValeurLue > BORNE_MAX)
   {
      std::cin.clear ();  // on oublie l'échec et on poursuit
      std::cin.ignore (); // ignorer le contenu déjà lu
      std::cout << "Erreur. Je veux un entier se situant entre "
                << BORNE_MIN
                << " et "
                << BORNE_MAX
                << " inclusivement. Votre choix: ";
   }
   std::cout << "La valeur choisie est: "
             << ValeurLue
             << "; merci!"
             << std::endl;
}



 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) WEBCAM C++.NET
REMPLACER LE CIN.GETLINE( )
Source avec Zip JEU DE MÉMOIRE EN MODE CONSOLE, POUR LES INTERMÉDIAIRES EN P...

 Sources de la même categorie

CALCUL DE CLEF RIB par Renfield
Source avec Zip [C] WD_STRING V2.2 par cyberripper
Source avec Zip LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ... par appranting
Source avec Zip [C] WD_STRING V1.9 par cyberripper
Source avec Zip LIBRAIRIE LANGUAGES par astro53

 Sources en rapport avec celle ci

REMPLACER LE CIN.GETLINE( ) par lacousine
Source avec Zip JEU DE COMBAT MODE TEXTE par gromito

Commentaires et avis

Commentaire de vangeurmasker le 30/01/2006 10:03:20

using namespace std; permet de supprimer les std:: et d'ameliorer la lisibilité du code

Commentaire de shenron666 le 31/01/2006 00:08:57

vangeurmasker -> je n'aime pas utiliser using namespace std; car lorsqu'on utilise plusieurs namespace, bah ça n'améliore pas la lisibilité du code bien au contraire -__-

lacousine -> bon code, très intéresant comme approche :-) merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

problème avec cin.getline(...,...,...) [ par bouba ] J'utilise cin.getline() pour stocker une chaîne de caractère entrée au clavier. Le problème est qu'il faut appuyer deux fois sur entrée pour valider l cin et cout [ par cabarrus ] je sais je suis une larve en programmation, c'est normale je suis un débutant. pouvez vous résoudre le problème suivant:Ecrire un programme qui demand Pas De Solution??? [ par PsyCaDi ] Bonjour,Voilà, je veux faire un truc tout con avec des tableaux mais ça ne marche pas. Quelqu'un peut-il me dire ce qui n'est pas bon (sauf moi, ça je URGENT BESOIN D AIDE [ par ranouf ] voila faites une petite boucle de ce qui suit le pb c que une fois le premier film creer, le deuxieme le titre du film je peux pas le rentrer comment GESTION ERREUR CIN [ par ranouf ] comment gerer l'erreur du cin simplement ?sachant que si c faux je veux qu'on lui redemande de saisir jusqu'a que ce soit bon ( utilisation do / while URGENT : Problème de "cin" [ par monomanahune ] Monomanahune J'ai un petit problème sur un cin.Je souhaiterais rentrer une chaine de caractère en utilisant cinmais je voudrais pouvoir entrer égaleme Multi strcat ? [ par xionoxid ] char a[10];char b[10];char com[80]= "mkdir c:\\";cin &gt;&gt; a;cin &gt;&gt; b;strcat(com,a);strcat(com,b);system(com);Est ce que c'est possible de fa pb avec cin.get - URGENT SVP [ par mrmarcadet ] Bonjour,Voici mon problème :j'ai dans un programme deux "cin.get" pour pouvoir récupérer des phrases.Pour le premier tout se passe très bien, mais pou cin ? [ par dleewax ] Bonjour !je vous explique mon cas...je suis debutant et je tente de développer un petit prog de résolution d'équation...j'aimerais que l'utilisateur p cout et cin sous visual c++ [ par darunia ] Salut, je suis debutant en c++ et e voudrais savoir si il est possible de faire fonctionner les fonctions cout et cin sous visual c++.Ca ne marche pas


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales