 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Plotark Guest
|
Posted: Mon Apr 05, 2004 8:59 am Post subject: Equivalent printf ostream |
|
|
Bonjour a tous,
J'aimerais ecrire en c++ l'equivalent de
printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,
u.clock_seq_hi_and_reserved,u.clock_seq_low);
Je suis sous visual c++.
Quelqu'un sait-il comment faire pour remplacer tous les formattages %x.x?
Plotark
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Mon Apr 05, 2004 6:18 pm Post subject: Re: Equivalent printf ostream |
|
|
"Plotark" <plotark.nospam (AT) ifrance (DOT) com> a écrit dans le message de
news:c4r70l$9gb$1 (AT) netserv (DOT) univ-lille1.fr...
| Quote: | Bonjour a tous,
J'aimerais ecrire en c++ l'equivalent de
printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,
u.clock_seq_hi_and_reserved,u.clock_seq_low);
Je suis sous visual c++.
Quelqu'un sait-il comment faire pour remplacer tous les formattages %x.x?
Plotark
tu peux déjà faire : |
cout.printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,u.clock_seq_hi_and_reserved,u.clock_seq_low
);
mais ce n'est qu'un pis-aller...
Regardes la doc de basic_ostream, il existe des fonctions membres
(setprecision par exemple) et des modificateurs pour changer le format de la
sortie.
Bonne chance !
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Tue Apr 06, 2004 2:35 am Post subject: Re: Equivalent printf ostream |
|
|
Dans news:c4r70l$9gb$1 (AT) netserv (DOT) univ-lille1.fr,
Plotark <plotark.nospam (AT) ifrance (DOT) com> a écrit :
| Quote: | Quelqu'un sait-il comment faire pour remplacer tous les formattages
%x.x?
|
Par exemple pour %8.8x, une fois pour toute :
... << right << setfill('0') << hex
puis
... << setw( << laValeur ...
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Hylvenir Guest
|
Posted: Tue Apr 06, 2004 6:28 am Post subject: Re: Equivalent printf ostream |
|
|
| Quote: | tu peux déjà faire :
cout.printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,u.clock_seq_hi_and_reserved,u.clock_seq_low
);
mais ce n'est qu'un pis-aller...
|
On parle bien de C++ là ?
cout.printf ? il n'y a pas de méthode printf sur cout.
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Apr 06, 2004 11:25 am Post subject: Re: Equivalent printf ostream |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote
| Quote: | Dans news:c4r70l$9gb$1 (AT) netserv (DOT) univ-lille1.fr,
Plotark <plotark.nospam (AT) ifrance (DOT) com> a écrit :
Quelqu'un sait-il comment faire pour remplacer tous les formattages
%x.x?
Par exemple pour %8.8x, une fois pour toute :
... << right << setfill('0') << hex
puis
... << setw( << laValeur ...
|
Maintenant, pour %8.6x, comment fais-tu ?
Moi, je fais :
std::cout << GB_Format( "%8.6x" ).with( x ) << 'n' ;
Mais évidemment, il faut télécharge la bibliothèque de ma site
d'abord:-). Et l'installer -- la version sur ma site n'a pas été testé
avec VC++.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Tue Apr 06, 2004 3:11 pm Post subject: Re: Equivalent printf ostream |
|
|
Dans news:d6652001.0404060325.5f30f68e (AT) posting (DOT) google.com,
[email]kanze (AT) gabi-soft (DOT) fr[/email] <kanze (AT) gabi-soft (DOT) fr> a écrit :
| Quote: | "Michel Michaud" <mm (AT) gdzid (DOT) com> wrote in message
news:<4Iocc.16991$wq4.837223 (AT) news20 (DOT) bellglobal.com>...
Dans news:c4r70l$9gb$1 (AT) netserv (DOT) univ-lille1.fr,
Plotark <plotark.nospam (AT) ifrance (DOT) com> a écrit :
Quelqu'un sait-il comment faire pour remplacer tous les
formattages %x.x?
Par exemple pour %8.8x, une fois pour toute :
... << right << setfill('0') << hex
puis
... << setw( << laValeur ...
Maintenant, pour %8.6x, comment fais-tu ?
|
Ce n'est ce qu'il demandait (%x.x). Si tu veux dire qu'il y a
des choses difficiles à faire avec les manipulateurs, alors
qu'elles sont faciles avec printf et compagnie, c'est vrai,
mais l'inverse est vrai aussi. Comment fais-tu ceci avec printf ?
cout << dec << setw(12) << setfill('_') << internal << -123;
Qui donne
-________123
Tu me diras que ce n'est pas très utile, mais je crois que %8.6x
non plus !
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Tue Apr 06, 2004 7:05 pm Post subject: Re: Equivalent printf ostream |
|
|
"Hylvenir" <Hylvenir (AT) libertysurf (DOT) fr> a écrit dans le message de
news:pan.2004.04.06.06.28.52.135601 (AT) libertysurf (DOT) fr...
| Quote: |
tu peux déjà faire :
cout.printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,u.clock_seq_hi_and_reserved,u.clock_seq_low
);
mais ce n'est qu'un pis-aller...
On parle bien de C++ là ?
cout.printf ? il n'y a pas de méthode printf sur cout.
Bah, tu as raison ! Je l'ai pourtant déjà vu (bon, il y a quelque temps, je |
ne me rappelle plus sur quel système)... Sans doute une extension ? J'ai
répondu trop vite sans réflechir encore une fois !
Ceci dit (mais je pinaille) printf c'est du C, *donc* du C++ ;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Apr 06, 2004 9:21 pm Post subject: Re: Equivalent printf ostream |
|
|
On Tue, 6 Apr 2004 21:05:40 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:
| Quote: | Ceci dit (mais je pinaille) printf c'est du C, *donc* du C++
|
::printf, oui. cout.printf, non.
--
;-)
|
|
| Back to top |
|
 |
Amerio Guest
|
Posted: Tue Apr 06, 2004 9:37 pm Post subject: Re: Equivalent printf ostream |
|
|
Plotark wrote:
| Quote: | Bonjour a tous,
J'aimerais ecrire en c++ l'equivalent de
printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,
u.clock_seq_hi_and_reserved,u.clock_seq_low);
Je suis sous visual c++.
Quelqu'un sait-il comment faire pour remplacer tous les formattages %x.x?
|
Si tu veux garder la même syntaxe, il y a boost::format qui accepte les même
entrées que printf.
std::cout << boost::format("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-") % u.time_low %
u.time_mid ....... << std::endl
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Apr 07, 2004 7:24 am Post subject: Re: Equivalent printf ostream |
|
|
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote
| Quote: | Dans news:d6652001.0404060325.5f30f68e (AT) posting (DOT) google.com,
[email]kanze (AT) gabi-soft (DOT) fr[/email] <kanze (AT) gabi-soft (DOT) fr> a écrit :
"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote in message
news:<4Iocc.16991$wq4.837223 (AT) news20 (DOT) bellglobal.com>...
Dans news:c4r70l$9gb$1 (AT) netserv (DOT) univ-lille1.fr,
Plotark <plotark.nospam (AT) ifrance (DOT) com> a écrit :
Quelqu'un sait-il comment faire pour remplacer tous les
formattages %x.x?
Par exemple pour %8.8x, une fois pour toute :
... << right << setfill('0') << hex
puis
... << setw( << laValeur ...
Maintenant, pour %8.6x, comment fais-tu ?
Ce n'est ce qu'il demandait (%x.x).
|
Mais ce qu'il démandait s'écrit la plupart du temps %08x en C, non
%8.8x. J'ai donc supposé un problème plus général.
| Quote: | Si tu veux dire qu'il y a des choses difficiles à faire avec les
manipulateurs, alors qu'elles sont faciles avec printf et compagnie,
c'est vrai, mais l'inverse est vrai aussi.
|
À vrai dire, mon point était plutôt qu'avec GB_Format, on pouvait faire
*tout* ce qu'on fait avec printf, tout en restant en C++, avec la
sécurité des types et les possibilités de définir des formattages pour
les types utilisateur (des operator<<) et des destinations nouvelles
(des dérivations de streambuf).
| Quote: | Comment fais-tu ceci avec printf ?
cout << dec << setw(12) << setfill('_') << internal << -123;
Qui donne
-________123
|
Tu n'as pas besoin de chercher aussi loin. Comment sortir un type
std::complex avec printf ? Ou n'importe quel type défini par
l'utilisateur ? Vers un socket, de préférence.
Tu n'as pas besoin de me convaincre des limitations de printf.
| Quote: | Tu me diras que ce n'est pas très utile, mais je crois que %8.6x non
plus !
|
Je ne sais pas. Il correspond bien à des « PIC ##999999 » de Cobol ou
des « USING "##999999" » de Basic. C-à-d que dans certaines applications
commerciales, peut-être...
En fait, j'ai surtout vue ce genre de chose avec des décimaux à virule
flottant, du genre « PIC ##999.99 ». Ce qui n'est possible ni avec
printf ni avec iostream. Mais étant donné qu'il n'y a pas de type
revenir à l'utilité, je crois que quelque chose du genre :
std::cout
<< std::left << std::setfill( '.' )
<< std::setw( 40 ) << std::string( title[ i ] ) + ' '
<< std::right << std::setfill( ' ' ) << std::setw( 2 ) << page[ i ]
<< 'n' ;
n'est pas sans utilité. (Mais si j'en avais besoin, j'avoue que je
créerais des manipulateurs propres, du genre ToCLabel et ToCPageNumber,
afin de pouvoir écrire :
std::cout
<< ToCLabel( 40 ) << title[ i ]
<< ToCPageNumber( 2 ) << page[ i ]
<< 'n' ;
AMHA, c'est bien plus lisible, et en dérivant de GB_StateSavingManip, ce
n'est vraiment que peu de code.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Apr 07, 2004 7:29 am Post subject: Re: Equivalent printf ostream |
|
|
"Amerio" <amerio (AT) hotmail (DOT) com> wrote
| Quote: | Plotark wrote:
J'aimerais ecrire en c++ l'equivalent de
printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low,
u.time_mid,u.time_hi_and_version,
u.clock_seq_hi_and_reserved,u.clock_seq_low);
Je suis sous visual c++.
Quelqu'un sait-il comment faire pour remplacer tous les formattages
%x.x?
Si tu veux garder la même syntaxe, il y a boost::format qui accepte
les même entrées que printf.
|
Tu en es sûr. Il me semblait qu'il y en avait qu'il ne comprenait pas,
et que la précision sur un entier en était un. (Je ne suis pas sûr. je
ne l'ai pas sous la main pour vérifier.)
GB_Format les accepte. Mais j'avoue que la décision de les supporter
revient plutôt d'une relevé d'un défi que d'une décision consciente de
leur nécessité ou de leur utilité.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Wed Apr 07, 2004 10:39 am Post subject: Re: Equivalent printf ostream |
|
|
le Wednesday 07 April 2004 09:29, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
| Quote: | Tu en es sûr. Il me semblait qu'il y en avait qu'il ne comprenait pas,
et que la précision sur un entier en était un. (Je ne suis pas sûr. je
ne l'ai pas sous la main pour vérifier.)
|
effectivement pour boost::format, un paramètre de précision est passé à
setprecision, même avec %d ou %x, ce qui n'a pas d'effet pour des
formattages d'entiers.
à un moment j'envisageais de rajouter 4-5 lignes de code pour me rapprocher
du comportement de printf, mais j'ai pas reçu de courriels pour
boost::format à ce propos alors j'imagine que ça n'intéresse personne pour
l'instant.
Personnellement si j'avais besoin de forcer une longueur maximale de chaine
formattée, j'ajouterais alors un signe qui marque les cas de troncation, et
je metterais ça dans une fonction :
std::string trunc_and_show(std::string s, int max,
char trunc_mark = '>' ) {
if(s.size() > max) {
s.resize(max-1);
s.append(trunc_mark);
}
return s;
}
on peut modifier pour passer s par const& pour éviter toute copie dans le
cas size<=max si c'est important.
Faire la troncation comme ça me semble plus utile que la troncation
directement dans printf..
enfin bon, pour supporter la syntaxe printf autant que possible, je vais
ptetre ajouter ça tot ou tard.
--
Sam
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Apr 07, 2004 2:29 pm Post subject: Re: Equivalent printf ostream |
|
|
Samuel Krempp <krempp (AT) crans (DOT) truc.en.trop.ens-cachan.fr> wrote
| Quote: | le Wednesday 07 April 2004 09:29, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
Tu en es sûr. Il me semblait qu'il y en avait qu'il ne comprenait
pas, et que la précision sur un entier en était un. (Je ne suis pas
sûr. je ne l'ai pas sous la main pour vérifier.)
effectivement pour boost::format, un paramètre de précision est passé
à setprecision, même avec %d ou %x, ce qui n'a pas d'effet pour des
formattages d'entiers.
à un moment j'envisageais de rajouter 4-5 lignes de code pour me
rapprocher du comportement de printf, mais j'ai pas reçu de courriels
pour boost::format à ce propos alors j'imagine que ça n'intéresse
personne pour l'instant.
|
En effet, il y a certainement de choses plus importantes.
| Quote: | Personnellement si j'avais besoin de forcer une longueur maximale de
chaine formattée, j'ajouterais alors un signe qui marque les cas de
troncation, et je metterais ça dans une fonction :
|
Attention, la précision dans un entier ne tronque pas. En fait, la
signification de la précision dans printf dépend du type et de la
spécification du formattage :
flottant :
Selon le format : pour %e et %f, donne le nombre de chiffres après
le décimal, pour un %g, le nombre de chiffres totaux (dans la
mantisse). Rémarque bien que quand %g formatte comme un %e, la même
précision donne un chiffre de plus en %e (et que quand le %g
formatte comme un %f, il n'y a aucun rapport immédiate entre le
nombre de chiffres dans les deux).
entier :
La précision donne le nombre minimum de chiffres à générer. Le
défaut est 1, ce qui donne "0" pour 0, mais on peut en passer 0 (ce
qui donne une chaîne vide pour 0) ou plus. Donc, quelque chose comme
"%8.4d" de 42 donne " 0042".
chaîne de caractères :
La précision spécifie le nombre maximum de caractères à prendre de
la chaîne. AMHA, ce n'est pas si utile avec std::string -- je peux
toujours passer un s.substr( 0, n ), pour n'en avoir que n au
maximum. Avec des char const*, ça peut être utile.
[...]
| Quote: | enfin bon, pour supporter la syntaxe printf autant que possible, je
vais ptetre ajouter ça tot ou tard.
|
Comme j'ai dit, je l'ai fais moi-même plutôt par esprit de défi. Je ne
crois pas que ce soit si essentiel. Si tu as du temps, et tu ne sais
quoi pas en faire, d'accord, mais autrement...
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Wed Apr 07, 2004 3:50 pm Post subject: Re: Equivalent printf ostream |
|
|
le Wednesday 07 April 2004 16:29, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
| Quote: | Attention, la précision dans un entier ne tronque pas. En fait, la
signification de la précision dans printf dépend du type et de la
spécification du formattage :
|
ah oui t'as raison, dans mon souvenir c'était une histoire de troncation..
auquel cas ça rentre à peu pres dans le meme cadre que la troncation pour
les chaines de caracs, qui est implémentée dans boost::format..
là c'est une longueur minimale préalable au padding, ce qui demande tout un
truc juste pour ça.
| Quote: | entier :
La précision donne le nombre minimum de chiffres à générer. Le
défaut est 1, ce qui donne "0" pour 0, mais on peut en passer 0 (ce
qui donne une chaîne vide pour 0) ou plus. Donc, quelque chose comme
"%8.4d" de 42 donne " 0042".
|
...
| Quote: | Comme j'ai dit, je l'ai fais moi-même plutôt par esprit de défi. Je ne
crois pas que ce soit si essentiel. Si tu as du temps, et tu ne sais
quoi pas en faire, d'accord, mais autrement...
|
c'est probablement ce que je m'étais dit aussi le jour où j'ai envisagé de
le faire :)
--
Sam
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Apr 07, 2004 7:06 pm Post subject: Re: Equivalent printf ostream |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
(Mais si j'en avais besoin, j'avoue que je
| Quote: | créerais des manipulateurs propres, du genre ToCLabel et ToCPageNumber,
afin de pouvoir écrire :
std::cout
ToCLabel( 40 ) << title[ i ]
ToCPageNumber( 2 ) << page[ i ]
'n' ;
AMHA, c'est bien plus lisible, et en dérivant de GB_StateSavingManip, ce
n'est vraiment que peu de code.
|
J'hésite pour ma part souvent entre une solution comme celle ci ou une
solution du style :
Label l = 40;
PageNumber p = 2;
sdt::cout << setw(40) << l << setw(2) << p << 'n';
Ou encore une solution :
Label l = 40;
PageNumber p = 2;
sdt::cout << l.toString(40) << p.toString(2) << 'n';
--
Loïc
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|