j'ai un petit programme dans lequel on demande à l'utilisateur de taper
un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier
que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé
"toto"
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien SK
Nicolas Aunai wrote:
j'ai un petit programme dans lequel on demande à l'utilisateur de taper un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé "toto"
int dummy; std::cin >> dummy; if (std::cin.fail()==true) { // erreur }
Nicolas Aunai wrote:
j'ai un petit programme dans lequel on demande à l'utilisateur de taper
un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier
que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé
"toto"
int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)
{
// erreur
}
j'ai un petit programme dans lequel on demande à l'utilisateur de taper un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé "toto"
int dummy; std::cin >> dummy; if (std::cin.fail()==true) { // erreur }
Sylvain Togni
int dummy; std::cin >> dummy; if (std::cin.fail()==true) { // erreur }
Ou plus simplement :
int dummy; if (std::cin >> dummy) { // ok }
C'est moins explicite mais c'est la façon idomatique de faire.
-- Sylvain
int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)
{
// erreur
}
Ou plus simplement :
int dummy;
if (std::cin >> dummy)
{
// ok
}
C'est moins explicite mais c'est la façon idomatique de faire.
int dummy; std::cin >> dummy; if (std::cin.fail()==true) { // erreur }
Ou plus simplement :
int dummy; if (std::cin >> dummy) { // ok }
C'est moins explicite mais c'est la façon idomatique de faire.
-- Sylvain
kanze
Fabien SK <fabsk+ wrote in message news:<3f8bf97d$0$13275$...
Nicolas Aunai wrote:
j'ai un petit programme dans lequel on demande à l'utilisateur de taper un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé "toto"
int dummy; std::cin >> dummy; if (std::cin.fail()==true)
if ( std::cin.fail() ) ...
{ // erreur }
Ce qui ne distingue pas entre la fin de fichier et une erreur.
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ; if ( ! cin ) { if ( cin.eof() ) { // fin de fichier... } else { // erreur de formattage... } }
Je ne dis pas que c'est bien ou élégant, mais c'est l'idiome, et ça évite toutes les ambiguïtés en ce qui concerne la sémantique de good(), bad() et fail().
Enfin, il faut peut-être aussi rappeler que les bits d'erreurs sont persistants ; si après avoir détecter l'erreur, on veut continuer, il faudrait quelque chose du genre :
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Fabien SK <fabsk+news@free.fr> wrote in message
news:<3f8bf97d$0$13275$626a54ce@news.free.fr>...
Nicolas Aunai wrote:
j'ai un petit programme dans lequel on demande à l'utilisateur de
taper un entier, celui ci est capté par cin>>i; quel est le moyen de
vérifier que j'ai bien un entier, et que l'utilisateur n'a par
exemple pas tapé "toto"
int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)
if ( std::cin.fail() ) ...
{
// erreur
}
Ce qui ne distingue pas entre la fin de fichier et une erreur.
La façon idiomatique de le faire, c'est :
int dummy ;
std::cin >> dummy ;
if ( ! cin ) {
if ( cin.eof() ) {
// fin de fichier...
} else {
// erreur de formattage...
}
}
Je ne dis pas que c'est bien ou élégant, mais c'est l'idiome, et ça
évite toutes les ambiguïtés en ce qui concerne la sémantique de good(),
bad() et fail().
Enfin, il faut peut-être aussi rappeler que les bits d'erreurs sont
persistants ; si après avoir détecter l'erreur, on veut continuer, il
faudrait quelque chose du genre :
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Fabien SK <fabsk+ wrote in message news:<3f8bf97d$0$13275$...
Nicolas Aunai wrote:
j'ai un petit programme dans lequel on demande à l'utilisateur de taper un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé "toto"
int dummy; std::cin >> dummy; if (std::cin.fail()==true)
if ( std::cin.fail() ) ...
{ // erreur }
Ce qui ne distingue pas entre la fin de fichier et une erreur.
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ; if ( ! cin ) { if ( cin.eof() ) { // fin de fichier... } else { // erreur de formattage... } }
Je ne dis pas que c'est bien ou élégant, mais c'est l'idiome, et ça évite toutes les ambiguïtés en ce qui concerne la sémantique de good(), bad() et fail().
Enfin, il faut peut-être aussi rappeler que les bits d'erreurs sont persistants ; si après avoir détecter l'erreur, on veut continuer, il faudrait quelque chose du genre :
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Fabien LE LEZ
On 15 Oct 2003 01:15:27 -0700, wrote:
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Fabien LE LEZ <gramster@gramster.com> wrote in message
news:<jdktov8utfku49358kcus24n32pdcrko1c@4ax.com>...
On 15 Oct 2003 01:15:27 -0700, kanze@gabi-soft.fr wrote:
La façon idiomatique de le faire, c'est :
int dummy ;
std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une
ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Benoit Rousseau
wrote:
Fabien LE LEZ wrote in message news:...
On 15 Oct 2003 01:15:27 -0700, wrote:
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le faire... Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un entier soit le caractère '*' qui signifié que je devais calculer l'entier avec les données que j'avais déjà.
Je faisais donc : F >> ws ;
if ( (c = F.fetch()) == '*' ) { ...; //calcul de la valeur F.get(); } else if( isdigit( c ) ) F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
Note : Oui, je vais m'acheter un bouquin, je le promets !
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/
kanze@gabi-soft.fr wrote:
Fabien LE LEZ <gramster@gramster.com> wrote in message
news:<jdktov8utfku49358kcus24n32pdcrko1c@4ax.com>...
On 15 Oct 2003 01:15:27 -0700, kanze@gabi-soft.fr wrote:
La façon idiomatique de le faire, c'est :
int dummy ;
std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une
ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le
faire...
Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un
entier soit le caractère '*' qui signifié que je devais calculer
l'entier avec les données que j'avais déjà.
Je faisais donc :
F >> ws ;
if ( (c = F.fetch()) == '*' ) {
...; //calcul de la valeur
F.get();
} else if( isdigit( c ) )
F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
Note : Oui, je vais m'acheter un bouquin, je le promets !
--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le faire... Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un entier soit le caractère '*' qui signifié que je devais calculer l'entier avec les données que j'avais déjà.
Je faisais donc : F >> ws ;
if ( (c = F.fetch()) == '*' ) { ...; //calcul de la valeur F.get(); } else if( isdigit( c ) ) F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
Note : Oui, je vais m'acheter un bouquin, je le promets !
-- -------------------------------------------- Benoît Rousseau : roussebe at spray dot se Jouez en programmant : http://realtimebattle.sourceforge.net/
kanze
Benoit Rousseau wrote in message news:<3f8faceb$0$9900$...
wrote:
Fabien LE LEZ wrote in message news:...
On 15 Oct 2003 01:15:27 -0700, wrote:
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le faire... Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un entier soit le caractère '*' qui signifié que je devais calculer l'entier avec les données que j'avais déjà.
Je faisais donc : F >> ws ;
if ( (c = F.fetch()) == '*' ) { ...; //calcul de la valeur F.get(); } else if( isdigit( c ) ) F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
C'est peut-être qu'il n'y a pas de fonction fetch dans std::istream. Est-ce que ce n'est pas plutôt peek que tu voulais ?
Mais déjà, quand on commence à avoir de telles complications, je préfère de lire par lignes.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Benoit Rousseau <not.provided@no.spam> wrote in message
news:<3f8faceb$0$9900$ba620e4c@reader0.news.skynet.be>...
kanze@gabi-soft.fr wrote:
Fabien LE LEZ <gramster@gramster.com> wrote in message
news:<jdktov8utfku49358kcus24n32pdcrko1c@4ax.com>...
On 15 Oct 2003 01:15:27 -0700, kanze@gabi-soft.fr wrote:
La façon idiomatique de le faire, c'est :
int dummy ;
std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire
une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le
faire...
Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un
entier soit le caractère '*' qui signifié que je devais calculer
l'entier avec les données que j'avais déjà.
Je faisais donc :
F >> ws ;
if ( (c = F.fetch()) == '*' ) {
...; //calcul de la valeur
F.get();
} else if( isdigit( c ) )
F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
C'est peut-être qu'il n'y a pas de fonction fetch dans std::istream.
Est-ce que ce n'est pas plutôt peek que tu voulais ?
Mais déjà, quand on commence à avoir de telles complications, je préfère
de lire par lignes.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Benoit Rousseau wrote in message news:<3f8faceb$0$9900$...
wrote:
Fabien LE LEZ wrote in message news:...
On 15 Oct 2003 01:15:27 -0700, wrote:
La façon idiomatique de le faire, c'est :
int dummy ; std::cin >> dummy ;
J'aurais cru que la façon idiomatique de faire ça, c'était de lire une ligne dans un std::string, puis de parser la chaîne, non ? ;-)
Ça dépend. En général, dans de réeles applications, oui. Parce qu'il faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une règle absolue, et dans des petits programmes d'exemple, ou des utilitaires vite faits, on peut s'en passer.
J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le faire... Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un entier soit le caractère '*' qui signifié que je devais calculer l'entier avec les données que j'avais déjà.
Je faisais donc : F >> ws ;
if ( (c = F.fetch()) == '*' ) { ...; //calcul de la valeur F.get(); } else if( isdigit( c ) ) F >> entier;
Le problème c'est que fetch ne marche pas :( comment faire ?
C'est peut-être qu'il n'y a pas de fonction fetch dans std::istream. Est-ce que ce n'est pas plutôt peek que tu voulais ?
Mais déjà, quand on commence à avoir de telles complications, je préfère de lire par lignes.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16