C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

std::cin le retour

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Ultimataupe
Guest





PostPosted: Tue Apr 12, 2005 3:26 pm    Post subject: std::cin le retour Reply with quote



Voici mon programme:

//utilisation sous Visual C++ 6
int main(int argc, char* argv[])
{
int i = 0;
while ( i != 1)
{
std::cout << "tapez 1" << std::endl;
std::cin >> i ;
}
std::cout << "bravo" << std::endl;

return 0;
}

Voici mon probleme:
si j'entre des lettres à la place des chiffres ça boucle sans fin.
Comment reinitialiser cin ?
(j'ai essayé un clear() mais sans succes).

Merci à tous.
Back to top
Alexandre
Guest





PostPosted: Tue Apr 12, 2005 5:35 pm    Post subject: Re: std::cin le retour Reply with quote



Quote:
Voici mon probleme:
si j'entre des lettres à la place des chiffres ça boucle sans fin.
Comment reinitialiser cin ?
(j'ai essayé un clear() mais sans succes).

de mémoire : cin.sync()

Quote:

Merci à tous.



Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Apr 13, 2005 6:50 am    Post subject: Re: std::cin le retour Reply with quote



Ultimataupe wrote:
Quote:
Voici mon programme:

//utilisation sous Visual C++ 6
int main(int argc, char* argv[])
{
int i = 0;
while ( i != 1)
{
std::cout << "tapez 1" << std::endl;
std::cin >> i ;
}
std::cout << "bravo" << std::endl;

return 0;
}

Voici mon probleme:

si j'entre des lettres à la place des chiffres ça boucle sans
fin. Comment reinitialiser cin ? (j'ai essayé un clear()
mais sans succes).

C'est bien clear() qu'il te faut, mais quand le flux a détecter
les lettres, il ne les a pas extraits. Alors, la prochaine fois
dans la boucle, il les rétrouve, et se met en erreur de nouveau.

C'est un problème général lors de l'interprétation des données
en entrée : comment résynchroniser en cas d'erreur. Dans ton
cas, il faut comme minimum lire (extraire) le caractère qui a
provoqué l'erreur (cin.get()). La plupart du temps quand on lit
cin, en revanche, on pense à des entrées interactives, ligne par
ligne. Dans ce cas-là, la fonction cin.ignore pourrait aider.
Pour des cas d'entrées à peine plus compliquer, l'idiome
classique est de lire ligne par ligne au moyen de getline, puis
d'analyser chaque ligne à part, éventuellement en l'utilisant
d'initialiser un istringstream. Du coup, on a une
synchronisation par ligne automatique.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Apr 13, 2005 6:56 am    Post subject: Re: std::cin le retour Reply with quote

Alexandre wrote:
Quote:
Voici mon probleme:
si j'entre des lettres à la place des chiffres ça boucle sans
fin.
Comment reinitialiser cin ?
(j'ai essayé un clear() mais sans succes).

de mémoire : cin.sync()

Dont le comportement dépend de l'implémentation. Je m'attendrais
dans la plupart des cas un no-op sur un flux d'entrée connecté à
un fichier. (Et Windows et Unix considère que le clavier est un
fichier.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Ultimataupe
Guest





PostPosted: Wed Apr 13, 2005 8:10 am    Post subject: Re: std::cin le retour Reply with quote


if (!cin.good())
{
cin.clear();
cin.sync();
}

ceci semble fonctionner .

Merci.
Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Apr 14, 2005 6:35 am    Post subject: Re: std::cin le retour Reply with quote

Ultimataupe wrote:
Quote:
if (!cin.good())
{
cin.clear();
cin.sync();
}

ceci semble fonctionner .

Peut-être sur certaines implémentations. Ou peut-être seulement
avec certaines sources de données. (Je n'ai pas de mal à
imaginer une implémentation où il fonctionne avec les entrées du
clavier, mais non si cin est rédirigé pour lire d'un fichier.)

Comme j'ai dit ailleurs, le comportement de cin.sync() est
laissé à la liberté de l'implémentation. J'en connais
effectivement où elle se positionne au début de la ligne, mais
seulement pour les entrées clavier. Ce n'est pas le genre de
choses sur lesquelles on peut compter. (Ton utilisation de
cin.good() n'est pas vraiment correcte non plus, mais je ne
crois pas qu'elle fasse une différence ici.)

La seule façon correcte à traiter le problème, c'est :

if ( ! cin ) {
cin.clear() ;
cin.ignore( INT_MAX, 'n' ) ;
}

Au moins qu'on utilise la solution classique, et lit au moyen de
getline.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.