OVH Cloud OVH Cloud

appuyer sur une touche

20 réponses
Avatar
Nico
Slt tlm,

Comment ça se fait un truc du genre :

"Appuyer sur Entrée pour continuer"


Et comment ça se fait un "Nettoyage de la sortie console"
(tout s'efface et la nouvelle sortie est placée en haut dans la console)

Nico

10 réponses

1 2
Avatar
Fabien LE LEZ
On Fri, 30 Dec 2005 18:31:32 +0100, Nico
:

Comment ça se fait un truc du genre :

"Appuyer sur Entrée pour continuer"


std::cout << "Appuyer sur Entrée pour continuer" << std::endl;
std::string bidon;
std::getline (std::cin, bidon);

Note : l'accent peut poser des problèmes si le jeu de caractères de la
console n'est pas le même que celui de ton éditeur. Je ne connais pas
de solution simple au problème, à part le remplacement par une lettre
non accentuée.

Et comment ça se fait un "Nettoyage de la sortie console"


Ce n'est pas faisable en C++.
Cf Ncurses, ou des fonctions spécifiques à ton système d'exploitation.

Avatar
Fabien LE LEZ
On Fri, 30 Dec 2005 20:05:53 +0100, Fabien LE LEZ
:

Cf Ncurses


D'ailleurs, si tu veux vraiment pondre une interface potable en mode
console, je ne pense pas que tu puisse échapper à ces nouvelles
malédictions.

Avatar
Cyrille

Et comment ça se fait un "Nettoyage de la sortie console"
(tout s'efface et la nouvelle sortie est placée en haut dans la console)


Si ta console est un terminal ANSI (VT100), il y a ceci:

cout << "x1b[Hx1b[2J" << flush;

--
Certes.

Avatar
Nico
Fabien LE LEZ m'a raconté au claviophone électronique moderne que :
On Fri, 30 Dec 2005 18:31:32 +0100, Nico
:


Comment ça se fait un truc du genre :

"Appuyer sur Entrée pour continuer"



std::cout << "Appuyer sur Entrée pour continuer" << std::endl;
std::string bidon;
std::getline (std::cin, bidon);



Merci

ça marche quand je le teste à part ; si je le mets dans un autre
programme, ça passe dessus comme si de rien était...

Y'a pas un SYSTEM_PAUSE wait SAISIE_CLAVIER ?

Nico

Note : l'accent peut poser des problèmes si le jeu de caractères de la
console n'est pas le même que celui de ton éditeur. Je ne connais pas
de solution simple au problème, à part le remplacement par une lettre
non accentuée.


Et comment ça se fait un "Nettoyage de la sortie console"



Ce n'est pas faisable en C++.
Cf Ncurses, ou des fonctions spécifiques à ton système d'exploitation.




Avatar
Cyrille
Fabien LE LEZ m'a raconté au claviophone électronique moderne que :

std::cout << "Appuyer sur Entrée pour continuer" << std::endl;
std::string bidon;
std::getline (std::cin, bidon);



Merci

ça marche quand je le teste à part ; si je le mets dans un autre
programme, ça passe dessus comme si de rien était...


supposons que tu avais écrit avant:
std::cin >> var;
Alors quand l'utilisateur entre une valeur, le programme extrait les
characteres et met la valeur dans var. Mais il laisse le caractère de
fin de ligne dans le buffer de std::cin. Du coup, si tu appelles
std::getline( ... ) ensuite, il voit tout de suite un caractère de fin
de ligne et il retourne immédiatement.
La solution est d'écrire:
std::cin.ignore();
après l'opération ">>".

Y'a pas un SYSTEM_PAUSE wait SAISIE_CLAVIER ?


gni?

--
Soit.


Avatar
Fabien LE LEZ
On Fri, 30 Dec 2005 23:39:11 +0100, Cyrille :

std::cin >> var;
Alors quand l'utilisateur entre une valeur, le programme extrait les
characteres et met la valeur dans var. Mais il laisse le caractère de
fin de ligne dans le buffer de std::cin.


Si je ne m'abuse[*], c'est même pire que ça : si l'utilisateur tape
"Hello World!n", "World!n" reste dans le buffer


[*] (Je n'utilise à peu près jamais operator>>, donc je ne suis pas
tout à fait sûr.)

Avatar
Cyrille
On Fri, 30 Dec 2005 23:39:11 +0100, Cyrille :


std::cin >> var;
Alors quand l'utilisateur entre une valeur, le programme extrait les
characteres et met la valeur dans var. Mais il laisse le caractère de
fin de ligne dans le buffer de std::cin.



Si je ne m'abuse[*], c'est même pire que ça : si l'utilisateur tape
"Hello World!n", "World!n" reste dans le buffer


Oui, en fait un
cin.ignore(numeric_limits<int>::max(), 'n');
est plus correct.

[*] (Je n'utilise à peu près jamais operator>>, donc je ne suis pas
tout à fait sûr.)


Moi non plus.

--
Ainsi.


Avatar
James Kanze
Nico wrote:

Comment ça se fait un truc du genre :


"Appuyer sur Entrée pour continuer"


std::cin.ignore( INT_MAX ) ;

(Formellement, je crois qu'à la place de INT_MAX, il faudrait
quelque chose comme « std::numeric_limits<
std::ios_base::streamsize >::max() » à la place de INT_MAX.
Pratiquement, ici, il suffit d'une valeur supérieur au nombre
maximum de caractères qu'un utilisateur pourrait entrer sans
Entrée.)

Et comment ça se fait un "Nettoyage de la sortie console"
(tout s'efface et la nouvelle sortie est placée en haut dans
la console)


Formellement, on ne peut pas, au moins pas d'une façon portable.
Dans la pratique, il suffit de sortir assez de 'n' ; ça serait
un drôle de console où :
std::cout << std::string( 100, 'n' ) << std::endl ;
ne faisait pas l'affaire.

Seulement, la nouvelle sortie serait placée en bas. Pour faire
mieux, il faut une bibliothèque supplémentaire non-standard, du
genre curses.

À la fin, laquelle des deux solutions conviennent dépend de ce
que tu fais. Si le seul but, c'est de s'assurer d'un
environement visuel vide pour la prochaine page de données, le
coup des 100 'n' suffit largement. Si tu cherches à faire une
gestion complète de l'écran, avec positionnement du curseur,
etc., il te faut curses (mais il faudrait peut-être poser la
question si, aujourd'hui, une GUI ne conviendrait pas mieux).

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

Avatar
Fabien LE LEZ
On Sun, 01 Jan 2006 12:03:57 +0100, James Kanze :

Formellement, on ne peut pas, au moins pas d'une façon portable.
Dans la pratique, il suffit de sortir assez de 'n' ; ça serait
un drôle de console où :
std::cout << std::string( 100, 'n' ) << std::endl ;
ne faisait pas l'affaire.


Chez moi, la console fait 9999 lignes par défaut.
Et balancer 10000 lignes blanches, ça risque de prendre du temps.

Avatar
Fabien LE LEZ
On Sun, 01 Jan 2006 12:03:57 +0100, James Kanze :

(mais il faudrait peut-être poser la
question si, aujourd'hui, une GUI ne conviendrait pas mieux).


Si le programme est prévu pour qu'on y accède via SSH (ou autre
Telnet), la ligne de commande peut se justifier. Cf "less" par
exemple.

1 2