cout versus printf

cout versus printf - C++ - Programmation

Marsh Posté le 17-11-2003 à 15:48:54    

Juste une petite question:
lorsque l'on a des tableaux de texte (un tableau par message et une ligne de chacun d'entre eux represente une langue) et que l'on souhaite afficher un message contenant un nombre dans une langue, on peut faire:

Code :
  1. printf(malignedetab, &valeur);


mais comment fait-on simplement avec cout ?

Reply

Marsh Posté le 17-11-2003 à 15:48:54   

Reply

Marsh Posté le 17-11-2003 à 16:08:33    

Code :
  1. std::string malignedetab="ligne";
  2. std::string valeur="5";
  3. cout << "ligne : " << malignedetab << " " << "valeur : " << valeur << endl;


Message édité par Harkonnen le 17-11-2003 à 16:09:42
Reply

Marsh Posté le 17-11-2003 à 16:16:30    

Harkonnen a écrit :

Code :
  1. std::string malignedetab="ligne";
  2. std::string valeur="5";
  3. cout << "ligne : " << malignedetab << " " << "valeur : " << valeur << endl;




Emmerdant si valeur doit être au milieu de la phrase...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-11-2003 à 16:20:27    

comme nraynaud l'a dit sur blabla@prog :
 

nraynaud a écrit :

moi j'ai compris, pour faire de l'internationalisation, il a chaque chaine de format stockée dans plusieurs langues, il sélectionne dynamiquement la chaine de format :  
 
const char[] fr = "le compte est de %d";
const char[] en = "the count is %d";
 
printf(message, count);
 
en se démerdant pour que message vale fr ou en avant d'appeller le printf.
 
Il veut faire le même système avec cout.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2003 à 16:26:36    

Perso je pense que je ferais comme ça:
1) je stockerais mes chaines dans toutes les langues avec un truc du style "xxxxx" pour reconnaitre l'emplacement de la valeur à insérer.
2) Je récupèrerais la chaine correspondant à la bonne langue dans une string temporaire.
3) Je ferais un replace de mon "xxxxx" par la valeur voulue dans ma string.
4) cout<<string_temporaire;


Message édité par skeye le 17-11-2003 à 16:27:30

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-11-2003 à 16:28:47    

Et quand t'as deux valeurs ?  
Ils ont quand même prévu un équivalent de printf qui retourne un std::string, non ? ou bien ils n'ont pas le sens pratique les gens qui font du C++ ? (non je ne trolle pas, mais bon en Delphi & C++Builder y a la fonction Format qui est bien pratique :whistle:)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2003 à 16:30:16    

Autant utiliser sprintf...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2003 à 16:30:17    

Code :
  1. ...
  2. char maChaine[256];
  3. ...
  4. sprintf( maChaine, format, valeur );
  5. cout<<maChaine<<endl;
  6. ...


 
quoi?
bon Ok je sors...
 
EDIT: non seulement réponse à 0.3? et en plus grilled...


Message édité par Moktar1er le 17-11-2003 à 16:32:10
Reply

Marsh Posté le 17-11-2003 à 16:31:08    

HelloWorld a écrit :

Autant utiliser sprintf...


 
faut une variable temporaire :(


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2003 à 16:33:14    

Oups... oui, j'ai oublie de donner un exemple...
C'etait un peu comme antp l'a repris de nraynaud mais bien evidemment avec le %d en plein ;ilieu de la phrase ;):
 
const char[] fr = "le compte est de %d voitures";
const char[] en = "the count is %d cars";
...
 
skeye -> je pensais utiliser cette methode mais cela contraint d'utiliser un string temporaire alors que dans ce cas le printf est plus simple a utiliser.

Reply

Marsh Posté le 17-11-2003 à 16:33:14   

Reply

Marsh Posté le 17-11-2003 à 16:34:02    

antp a écrit :

Et quand t'as deux valeurs ?  
Ils ont quand même prévu un équivalent de printf qui retourne un std::string, non ? ou bien ils n'ont pas le sens pratique les gens qui font du C++ ? (non je ne trolle pas, mais bon en Delphi & C++Builder y a la fonction Format qui est bien pratique :whistle:)


ah oui tiens ma soluce est très laide (mais moins que celle de Harko...[:cupra]).
 
Je crois pas avoir vu d'équivalent à Format pour les string, qui existe dans les MFC par contre... [:skeye]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-11-2003 à 16:35:35    

un volontaire pour envoyer un MP à Taz ? :D

Reply

Marsh Posté le 17-11-2003 à 16:36:20    

skeye a écrit :


ah oui tiens ma soluce est très laide (mais moins que celle de Harko...[:cupra]).


oui mais moi j'ai pas compris dés le début ce qu'il voulait [:antp]

Reply

Marsh Posté le 17-11-2003 à 16:40:35    

personne qui sait ? c'est grave quand même.
 
ça marche comment en java ? ça doit être une solution du même style.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 16:42:46    

Harkonnen a écrit :


moi j'ai pas compris dés le début ce qu'il voulait

c'est sur que les trucs propres et dans la bonne langue ; en assembleur c'est un peu une hérésie.


Message édité par nraynaud le 17-11-2003 à 16:43:35

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 16:43:21    

nraynaud a écrit :

personne qui sait ? c'est grave quand même.


clair... le genre de question à la con qui plante tout le monde :/
qui se dévoue pour envoyer un MP à Taz ?

Reply

Marsh Posté le 17-11-2003 à 16:43:47    

nraynaud a écrit :

c'est sur que les trucs propres et dans la bonne langue ; en assembleur c'est un peu une hérésie.

[:sinclaire]

Reply

Marsh Posté le 17-11-2003 à 16:51:45    

BB138 >> regarde ici si tu peux trouver un truc qui t'aide... :/
 
http://groups.google.com/groups?q= [...] art=0&sa=N

Reply

Marsh Posté le 17-11-2003 à 17:08:45    

A priori dans ce que j'ai pu lire sur le lien indique, il n'y a pas grand chose pour remplacer le printf dans quelques situations...

Reply

Marsh Posté le 17-11-2003 à 17:15:23    

oui ?

Reply

Marsh Posté le 17-11-2003 à 17:16:44    

\o/
t'as une idée pour ce topic tellement idiot que personne n'est capable de le résoudre ? :D

Reply

Marsh Posté le 17-11-2003 à 17:18:01    

Disons le remplacer par quelque chose d'aussi simple.
 
Je garderai donc mon printf...


Message édité par bb138 le 17-11-2003 à 17:18:44
Reply

Marsh Posté le 17-11-2003 à 17:18:40    

je capte pas trop, vous voulez quoi en fait ? un printf-like vraiment C++ ?

Reply

Marsh Posté le 17-11-2003 à 17:19:35    

Et bien oui, mais en utilisant directement cout !

Reply

Marsh Posté le 17-11-2003 à 17:22:58    

1) utilise des trucs genre gettext pour les traduction
2) j'ai toujours pas compris ton truc. j'ai 2 solutions en tête mais je sais pas si ça va : boost::format ou alors tout simplement des modificateurs de flux

Reply

Marsh Posté le 17-11-2003 à 17:28:20    

boost::format ça a l'air d'être ce qu'il cherche :
http://www.boost.org/libs/format/index.htm


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2003 à 17:30:02    

boost::format  ?? oups... je ne connais pas...
sinon ok pour les modificateurs de flux (si tu as quelques precisions la decu)
 
Pour gettext, j'approfondirai des que j'aurai le temps.

Reply

Marsh Posté le 17-11-2003 à 17:30:24    

oups un cran de retard...

Reply

Marsh Posté le 17-11-2003 à 17:32:36    

ben pour les modificateurs, je parle de truc genre endl, ends, hex, boolapha, y a moyen de fabriquer ses propres trucs. et y a encore plein d'autres trucs faisables, genre
 
cout << Log() << "des messages";
 
qui te permettrait un affichage du genre
 
"10h15 des messages fin de log"

Reply

Marsh Posté le 17-11-2003 à 17:34:38    

Merci, je crois que boost::format va vraiment faire mon bonheur !!!
Biensur ce n'est pas aussi simple qu'un bon printf mais au premier abord, j'aime bien.


Message édité par bb138 le 17-11-2003 à 17:36:30
Reply

Marsh Posté le 17-11-2003 à 17:36:07    

maintenant qui est capable de dire pourquoi boost::format (ou tout autre bordel C++) est bien meilleur que n'importe quel printf ?

Reply

Marsh Posté le 17-11-2003 à 17:39:23    

Citation :

faut une variable temporaire :(


 
Ok ok. On essai de faire un truc C en C++. Faut chercher comment faire l'équivalent selon une approche C++, et pas strictement la même chose.
 
en C:

Code :
  1. const char[] fr = "le compte est de %d";
  2. const char[] en = "the count is %d";
  3. const char * message;
  4. void init()
  5. {
  6. #ifdef FRENCH
  7.     message = fr;
  8. #else
  9.     message = en;
  10. #endif
  11. }
  12. int main()
  13. {
  14.     init();
  15.     int count = 100;
  16.     printf(message, count);
  17.     return 0;
  18. }


 
 
en C++

Code :
  1. string getMessage(int Val)
  2. {
  3.     static const char[] fr = "le compte est de ";
  4.     static const char[] en = "the count is ";
  5.     ostringstream msg;
  6. #ifdef FRENCH
  7.     msg << fr << Val << ".";
  8. #else
  9.     msg << en << Val << ".";
  10. #endif
  11.     return msg.str();
  12. }
  13. int main()
  14. {
  15.     int count = 100;
  16.     cout << getMessage(count);
  17.     return 0;
  18. }


 
Un truc du genre.
Le static marque juste l'idée que chaque fonction se charge des chaînes. Par ex, en Win32, cela revient à récupérer la string depuis une ressource à partir d'un identifiant donné.
C'est lourd à écrire, mais ça me parraît tout de même meilleur. Tu peux au passage gérer la conversion (manétaire, métrique, ...), et c'est plus facile à utiliser que d'aller trouver la bonne chaine qui faut pour le printf et de pas se gourrer dans les arguments attendus. Ca m'amène à une remarque sur pourquoi je préfère cout à printf : si demain, tu veux afficher un float à la place de ton int, faut reprendre XXX lignes de code. Pas avec le cout. Même avec un printf, ça démontre l'utilité d'une fonction spécialisée (ou il suffirait de modifier une seule ligne de printf + le paramètre attendu, ou alors surcharge).


Message édité par HelloWorld le 17-11-2003 à 17:40:03

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2003 à 17:39:46    

Taz a écrit :

maintenant qui est capable de dire pourquoi boost::format (ou tout autre bordel C++) est bien meilleur que n'importe quel printf ?

ça compile plus lentement ?
le système de types statiques tout transpercé donne l'illusion aux naïfs que c'est sécure ?
ça permet de rajouter du bordel dans les includes ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 17:42:09    

nraynaud a écrit :

ça compile plus lentement ?
le système de types statiques tout transpercé donne l'illusion aux naïfs que c'est sécure ?
ça permet de rajouter du bordel dans les includes ?

très drôle. si je prends l'engagement de plus allez faire des remarques sur Java, tu retournes à ton caml ?
surtout vu la tronche de ton code ...
sinon, je fais des traductions et conseille l'emploi de gettext. ta méthode est à proscrire. surtout que tu ne connais meme pas les bases de C++ (ou C) pour localiser un minimum

Reply

Marsh Posté le 17-11-2003 à 17:42:59    

HelloWorld a écrit :

float à la place de ton int, faut reprendre XXX lignes de code.

On a inventé la liaison retardée longtemps avant le bordel de la surcharge tu sais ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 17:46:30    

Citation :

On a inventé la liaison retardée longtemps avant le bordel de la surcharge tu sais ?


 
T'es assez spécialiste des langages (surtout des + farfelus :p *), mais pas moi. La liaison retardée, je sais vaguement ce que c'est... en VB. Ca ressemble à quoi en C?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(*) Humour hein! :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2003 à 17:47:52    

Taz a écrit :

très drôle. si je prends l'engagement de plus allez faire des remarques sur Java, tu retournes à ton caml ?
surtout vu la tronche de ton code ...
sinon, je fais des traductions et conseille l'emploi de gettext. ta méthode est à proscrire. surtout que tu ne connais meme pas les bases de C++ (ou C) pour localiser un minimum


1) non c'est pas drole, ça ne fait plus rire. Non, je me barre pas de ce que tu sembles considérer comme ta catégorie. Et non, je ne t'interdit pas d'aller dans les catégories que tu veux.
2) mon code il t'emmerde, moi avec lui.
3) c'est pas ma méthode, c'est l'interpretation que j'avais faite du message initial. Et non, je ne connais pas les bases de la localisation, d'où ma présence ici.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 17:49:22    

c'est ma cat :o

Reply

Marsh Posté le 17-11-2003 à 17:49:28    

HelloWorld a écrit :

Citation :

On a inventé la liaison retardée longtemps avant le bordel de la surcharge tu sais ?


 
T'es assez spécialiste des langages (surtout des + farfelus :p *), mais pas moi. La liaison retardée, je sais vaguement ce que c'est... en VB. Ca ressemble à quoi en C?


En C tu n'as même pas envie de savoir, c'est pire que Beyrouth. En C++ c'est toutes les histoires de "virtual".


Message édité par nraynaud le 17-11-2003 à 17:54:10

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2003 à 17:51:54    

Taz a écrit :

c'est ma cat :o

spa si simple ! Tu l'avais laissée à l'abandon, il va falloir la reconquérir maintenant.
 
nraynaud > Tchetchenie [:aloy]


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed