Surcharge de l'operateur ">>" du cin

cs_pounch Messages postés 12 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 22 novembre 2003 - 21 nov. 2003 à 16:21
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 22 nov. 2003 à 17:01
bon voila mon probleme

j'aimerai parser une ligne de commande grace au cin et afficher un prompt lorsque j'ai fini de parser. Mais le cin n'a pas de methode pour connaitre la fin de la ligne parser ( ou bien je la connais pas ... ce qui est tout à fait possible ^_^ ) donc mon idée c'est de surcharger "operator>>" afin d'acceder à la variable protected "streamsize" dans le but de connaitre la fin du buffer et ainsi afficher ce pu... de prompt !!!!

Merci d'avance ^_^

il existe 10 types de gens ceux qui savent compter en binaire et les autres.

7 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 nov. 2003 à 17:05
ya bien cin.eof()
0
cs_pounch Messages postés 12 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 22 novembre 2003
21 nov. 2003 à 18:30
Voici mon code de test

for (;;) {

std::cout << "> ";
std::cin >> cmd;

while (!std::cin.eof()) {

std::cin >> cmd;

if (atoi(cmd) || (cmd[0] == '0')) {
pile->push(atoi(cmd));
} else if (convert[cmd]) {
(convert[cmd])->eval(pile);
} else
std::cout << "operateur inconnu !" << std::endl;
}
}

lorsque je l'execute j'ai une boucle infini :( SNIFFF !!! ca marche po :((((

il existe 10 types de gens ceux qui savent compter en binaire et les autres.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 nov. 2003 à 18:58
j'avoue ne pas comprendre ou tu ve en venir, j'ai relu ta question, pour parser une commande, il faut que tu la recupere dans un char[] (normal non?)
alors pourquoi tu fait pas tout simplement
cin.getline(cmd,sizeof(cmd)) ?
0
cs_pounch Messages postés 12 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 22 novembre 2003
22 nov. 2003 à 14:59
effectivement j'ai po ete tres clair ( mais desolet 1000x car j'etais press" ;) )

bon en fait mon probleme c'est que j'ai un prompt qui resemble à ca :

> ( ici les commandes )

le probleme c'est que quand j'execute mon algo de traitement de chaine avec le std::cin >> truc et bien ca donne soit ca :

> 5 6 3
> > >

car je reaffiche à chaque fois le ">" soit :

> 5 3 6
( ici plus rien, mais on peu continuer à ecrire )

J'ai effectivement trouve un moyen de contourner le probleme en utilisant le std::cin.find(...), mais c'est po top beau comme code ( et c'est pas tres oriente objet :D ) enfin bref.
J'aimerais "simplement" surcharger iostream ( et non pas cin comme je l'avais dit ) afin de pouvoir redefinir la double indirection ( ">>" ).
Ainsi je pourrais juste faire "std::cin >> truc" et automatiquement en fin de buffer j'afficherai un nouveau prompt. Genre ca:

> 5 3 6
> ...
>

Merci d'avance ^_^

il existe 10 types de gens ceux qui savent compter en binaire et les autres.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
22 nov. 2003 à 15:25
>> est un operator de istream, tu pourra pas le surcharger dans iostream, ensuite pour le surcharger(a l'exterieur de istream) :
istream& operator >> (istream& i,const T& mot)
{
return i>>mot>>(ce que tu ve);
}
> j'ai mis T comme type car si j'avais mis char* yorai surcharge

mais si je comprend bien tu ve enfaite qu'un prompte s'affiche apres chaque saisie de commande?
parce que si c'est le cas je voit pas comment surcharger >> peut resoudre ton probleme
en fait il suffit de faire cout<<'>'; non?
0
cs_pounch Messages postés 12 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 22 novembre 2003
22 nov. 2003 à 15:47
10000000000000000000000000000000000000000000000x merci c'est exectement ce que je voulais faire !!!

pour ta seconde question en fait le prob c'est que je faisais ca :

for(;;) {

std::cout << "> "; // ici j'affichais le prompt
std::cin >> cmd; //et la je parsais

/*
j'avais donc le prompt qui s'afficher autant de fois que
j'avais de commandes
*/

if (atoi(cmd) || (cmd[0] == '0')) {
pile->push(atoi(cmd));
} else if (convert[cmd]) {
(convert[cmd])->eval(pile);
} else
std::cout << "operateur inconnu !" << std::endl;
}
}

mais y'avais pit etre moyen de faire autrement ????
d'alleiur si tu as une idee je suis preneur !!

merci encore :big)

il existe 10 types de gens ceux qui savent compter en binaire et les autres.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
22 nov. 2003 à 17:01
ah! je vien de comprendre ton probleme!

en effet si je fait
for(;;)
{
cout<<"> ";
cin>>cmd;
...
}

et que je saisi
>kfjdkjf fkfl f fkj
j'aurai
>>>>

la solution est de faire cin.getline(cmd,sizeof(cmd); au lieu de cin>>cmd; et ensuite de recuperer chaque commande dans cmd(puisque tu sai qu'elles sont séparé par des espaces)
c'est plus propres de faire comme ca!
bonne chance
0
Rejoignez-nous