C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Equivalent printf ostream
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Plotark
Guest





PostPosted: Mon Apr 05, 2004 8:59 am    Post subject: Equivalent printf ostream Reply with 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


Back to top
Alexandre
Guest





PostPosted: Mon Apr 05, 2004 6:18 pm    Post subject: Re: Equivalent printf ostream Reply with quote




"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





PostPosted: Tue Apr 06, 2004 2:35 am    Post subject: Re: Equivalent printf ostream Reply with quote



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(Cool << 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





PostPosted: Tue Apr 06, 2004 6:28 am    Post subject: Re: Equivalent printf ostream Reply with quote


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





PostPosted: Tue Apr 06, 2004 11:25 am    Post subject: Re: Equivalent printf ostream Reply with quote

"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(Cool << 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





PostPosted: Tue Apr 06, 2004 3:11 pm    Post subject: Re: Equivalent printf ostream Reply with 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 :
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(Cool << 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





PostPosted: Tue Apr 06, 2004 7:05 pm    Post subject: Re: Equivalent printf ostream Reply with quote


"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





PostPosted: Tue Apr 06, 2004 9:21 pm    Post subject: Re: Equivalent printf ostream Reply with quote

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++ Wink

::printf, oui. cout.printf, non.

--
;-)

Back to top
Amerio
Guest





PostPosted: Tue Apr 06, 2004 9:37 pm    Post subject: Re: Equivalent printf ostream Reply with quote

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





PostPosted: Wed Apr 07, 2004 7:24 am    Post subject: Re: Equivalent printf ostream Reply with quote

"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(Cool << 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





PostPosted: Wed Apr 07, 2004 7:29 am    Post subject: Re: Equivalent printf ostream Reply with quote

"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





PostPosted: Wed Apr 07, 2004 10:39 am    Post subject: Re: Equivalent printf ostream Reply with quote

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





PostPosted: Wed Apr 07, 2004 2:29 pm    Post subject: Re: Equivalent printf ostream Reply with quote

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





PostPosted: Wed Apr 07, 2004 3:50 pm    Post subject: Re: Equivalent printf ostream Reply with quote

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





PostPosted: Wed Apr 07, 2004 7:06 pm    Post subject: Re: Equivalent printf ostream Reply with quote

[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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.