Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/04/2008, à 22:51

Chiuchu

[Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Salut,

Je suis en plein développement d'un jeu de plateau nommé Boggle, je ne vous cacherai pas que c'est pour la fac. Les algo. finis et codés, j'aimerai ajouter un petit bonus à l'appli. quand elle signale aux joueurs le temps leur restant.
Pour cela, j'ai besoin de récrire la dernière ligne sortie, à la manière de wget avec sa barre de progression.

Après maintes et maintes recherches (j'ai le temps maintenant qu'il est finit), j'ai cru comprendre qu'il fallait utiliser le caractère \r pour revenir en arrière d'un caractère, mais celui ci m'ajoute simplement une ligne, à la manière du \n ou du <br /> en HTML.

Je code sous eclipse-cdt. Comment faire pour récrire la dernière ligne de la console ?

J'ai besoin d'un truc tout simple, pas d'une bibliothèque à ajouter (comme boost) qui pourraient avoir des conséquences sur mon intégrité physique le jour de la soutenance face à mon prof (vous ne le connaissez pas...) tongue
Mais si il faut obligatoirement surcharger le code de cette manière, je préfère laisser tomber.

Merci beaucoup.

+

Dernière modification par Chiuchu (Le 30/04/2008, à 17:14)

Hors ligne

#2 Le 28/04/2008, à 22:58

Le Farfadet Spatial

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Salut à tous !

Chiuchu a écrit :

J'ai besoin d'un truc tout simple, pas d'une bibliothèque à ajouter (comme boost) qui pourraient avoir des conséquences sur mon intégrité physique le jour de la soutenance face à mon prof (vous ne le connaissez pas...) tongue
Mais si il faut obligatoirement surcharger le code de cette manière, je préfère laisser tomber.

Je crains qu'il n'y ait pas de solution simple n'utilisant que la bibliothèque standard... En fait, ce que tu veux faire, fondamentalement, c'est mettre en forme ta sortie et pouvoir modifier une zone précise de ton écran. Ça, NCurses le fait très bien. Par contre, à la main, c'est vraiment galère. En tout cas, ça n'est pas faisable avec un simple std::cout.

   Donc, je dirais : soit tu utilises NCurses, soit tu laisses tomber...

   Désolé d'être le porteur de mauvaise nouvelle.

   À bientôt.

                                                                                                                                             Le Farfadet Spatial

Hors ligne

#3 Le 28/04/2008, à 23:10

Zapan

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Bonsoir,
Il me semble que le caractère que tu cherches c'est '\b', pas '\r'.

Hors ligne

#4 Le 28/04/2008, à 23:11

Chiuchu

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Salut,

Au moins je suis fixé smile

Merci beaucoup pour la réponse !

Bonne soirée !

Hors ligne

#5 Le 28/04/2008, à 23:15

Chiuchu

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Zapan a écrit :

Bonsoir,
Il me semble que le caractère que tu cherches c'est '\b', pas '\r'.

Si je fais un

cout << "012345\b";

j'ai alors droit à un

012345

en sortie.

Merci quand même.

Hors ligne

#6 Le 29/04/2008, à 03:45

nicolas66

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

D'après ce que j'ai pu comprendre, tu voudrais simplement mettre à jour une barre de progression qui tiendrait sur une ligne. Si c'est le cas, tu peux t'en sortir sans problèmes sans ncurses. Suffit juste de flusher la sortie standard et d'afficher autant de caractères '\b' que nécessaire ...

Comme je suis sympa, je te file le morceau de code qui fonctionne :

#include <iostream>
#include <sstream>
#include <string>

//--- Typedefs -----------------------------------------------------------
typedef unsigned short ushort;


//--- Functions ----------------------------------------------------------
// Tente de convertir un objet en string
template <typename T> std::string ToString( const T & Value )
{
	std::ostringstream Oss;
	Oss << Value;
	return Oss.str();
}


//--- Main ---------------------------------------------------------------
int main( int Argc, char ** Argv )
{
	// Variables entières diverses
	register ushort i(0), k(0), OutputSize;

	// Capacité de la barre
	register ushort Total(100);

	// Nombre de caractères # par unité (1 => 100 caractères #, 3 => 33 caractères, etc.)
	register ushort NbChars(3);

	// Strings
	std::string Output, Tmp;


	std::cout << "[ Begin ]" << std::endl;

	while( i <= Total )
	{
		Tmp        = ToString(i);
		Output     = std::string(3 - Tmp.size(), ' ') + Tmp + "% - [" + std::string(i / NbChars, '#') + std::string(100 / NbChars - i / NbChars, ' ') + "]";
		OutputSize = Output.size();

		for( k=0; k<OutputSize; k++ )
			std::cout << '\b';

		std::cout << Output << std::flush;

		usleep(100000);
		i++;
	}

	std::cout << std::endl << "[ End ]" << std::endl;

	return EXIT_SUCCESS;
}

A bientôt !


Nico.


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#7 Le 30/04/2008, à 04:06

Chiuchu

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Salut Nicolas,

J'ai minutieusement étudié ton code, et il correspond parfaitement aux connaissances que je souhaitais acquérir. Merci.

Je me suis même exercé en faisant une version plus soft de la forme de ce qu'on fait à l'IUT (on a pas fait les ellipses dans le main(), les templates, et on est obligé d'utiliser using namespace std;). J'ai fait un petit compteur :

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
	unsigned int c = 0;

	while(c < 100)
	{
		string s;
		s = string(c, ' ');
		for(unsigned int i = 0; i < s.size(); ++i)
			cout << "\b";

		cout << c << flush;
		usleep(100000);
		c++;
	}
	cout << endl << "ok";
	return EXIT_SUCCESS;
}

J'ai aussi compris l'utilité du "flush" qui sert à afficher sans attendre la fin du programme.

C'est bien, comme le disait Zapan, \b qu'il fallait utiliser. Ca marche très bien dans une console normale, via l'ide geany aussi, mais ça donne un mauvais rendu dans la console de l'ide eclipse, sur lequel on passe nos soutenances (j'ai droit à des "  "). Tu saurais m'expliquer pourquoi ou me donner un indice ?
J'ai pensé que c'était peut-être dû à la police. Mais la console gnome et celle d'eclipse utilisent toutes les deux Monospace (la même), j'ai vérifié. Google ne donne pas grand chose avec les mots clef "backspace eclipse c++" (encore moins avec \b au lieu de backspace).


Merci !

Dernière modification par Chiuchu (Le 30/04/2008, à 04:16)

Hors ligne

#8 Le 30/04/2008, à 06:31

aeacides

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

est-ce que ça pourrait être du à l'encodage de caractère? ... (iso, utf-8, etc...):rolleyes:

Dernière modification par aeacides (Le 30/04/2008, à 06:32)


http://www.q-be.ca

Hors ligne

#9 Le 30/04/2008, à 15:34

Chiuchu

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

aeacides a écrit :

est-ce que ça pourrait être du à l'encodage de caractère? ... (iso, utf-8, etc...):rolleyes:

La console eclipse est en UTF-8 (vérifié), tout comme celle de gnome il me semble. J'ai trouvé des liens officiels qui suggèrent que c'est un bug connu d'eclipse :

https://bugs.eclipse.org/bugs/show_bug.cgi?id=113015
https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936
...

pas mal de monde l'a fait remarqué on dirait. J'enquête sur comment outre passer ça.

+

Dernière modification par Chiuchu (Le 30/04/2008, à 17:15)

Hors ligne

#10 Le 30/04/2008, à 17:47

nicolas66

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

pas mal de monde l'a fait remarqué on dirait. J'enquête sur comment outre passer ça.

J'aurai pas su te répondre sur ce point, j'ai jamais utilisé d'IDE et encore moins Eclipse. Content que tu aies trouvé l'origine du problème smile

Note : lorsque tu bosses sur de gros projets, essayes au maximum de ne pas utiliser l'instruction "using namespace x". Elle permet d'éviter les conflits éventuels entre différents noms de fonctions. J'entends déjà certains dirent que je pinaille mais ca permet de s'acquitter de problèmes à l'avance.

Exemple 1 (à éviter)

using namespace std;

double sqrt( double a ){ ... }

int main()
{
        sqrt(2.0); // Plantage, le compilo ne sait pas quelle fonction choisir !
}

Exemple 2 (à suivre)

namespace foo
{
        double sqrt( double a ){ ... }
}

int main()
{
        foo::sqrt(2.0); // Pas de plantage, le compilo sait qu'il faut qu'il utilise la fonction `sqrt' de l'espace de noms `foo'.
}

Conclusion : on peut utiliser cette directive tout en sachant pertinemment à quoi on s'expose. On s'en sert surtout pour de grosses bibliothèques mais pas pour de simples tests. Mais l'habitude est bonne à prendre (avis perso tongue).

Dernière modification par nicolas66 (Le 30/04/2008, à 17:48)


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#11 Le 30/04/2008, à 22:34

Le Farfadet Spatial

Re : [Résolu] [C++] Replacer une ligne/caractère sorti dans la console

Salut à tous !

nicolas66 a écrit :

Note : lorsque tu bosses sur de gros projets, essayes au maximum de ne pas utiliser l'instruction "using namespace x". Elle permet d'éviter les conflits éventuels entre différents noms de fonctions. J'entends déjà certains dirent que je pinaille mais ca permet de s'acquitter de problèmes à l'avance.

Non, tu ne pinailles pas, tu as parfaitement raison. De toute façon, le nom de l'espace de nommage de la bibliothèque standard est « std, » donc court. De sorte qu'il n'y a rien qui justifie où que ce soit d'avoir recours à « using namespace std. » C'est d'ailleurs pour cette raison que ce nom a été choisi.

   À bientôt.

                                                                                                                                                Le Farfadet Spatial

Hors ligne