Equivalent printf

Le
Guillaume GOURDIN
Bonjour à tous,

quel serait l'équivalent c++ d'un printf("%04x") ?

Merci pour votre aide.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #1065389
Bonjour à tous,


Bonjour,

quel serait l'équivalent c++ d'un printf("%04x", variable) ?


Tu peux utiliser la bibliothèque boost
se voir intégrer au standard :

std::cout << boost::format("%04x") % variable ;


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Jean-Marc Bourguet
Le #1065388
Mickaël Wolff
Bonjour à tous,


Bonjour,

quel serait l'équivalent c++ d'un printf("%04x", variable) ?




#include <iomanip>
#include <iostream>

std::cout << std::hex << std::setw(4) << std::setfill('0') << variable;

Tu peux utiliser la bibliothèque boost
se voir intégrer au standard :

std::cout << boost::format("%04x") % variable ;


Il y a des parties de boost qui ont des chances de se retrouver dans la
prochaine norme, mais je ne me souviens pas avoir vu boost::format dedans.
Tu as une reference?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Mickaël Wolff
Le #1066848

#include <iomanip>
#include <iostream>

std::cout << std::hex << std::setw(4) << std::setfill('0') << variable;


Certes, mais il demandais un équivalent avec la chaine de formatage,
enfin... c'est comme ça que je l'ai compris.


Il y a des parties de boost qui ont des chances de se retrouver dans la
prochaine norme, mais je ne me souviens pas avoir vu boost::format dedans.
Tu as une reference?


Je vois encore boost comme un monolithe, ce qui fait que j'ai associé
l'information concernant l'intégration potentielle de boost dans le
standard comme étant totale et non partielle. Désolé pour la confusion,
et merci de m'avoir corrigé.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

espie
Le #1066671
In article Mickaël Wolff

#include <iomanip>
#include <iostream>

std::cout << std::hex << std::setw(4) << std::setfill('0') << variable;


Certes, mais il demandais un équivalent avec la chaine de formatage,
enfin... c'est comme ça que je l'ai compris.


Non, ne pas lire plus que ce que ton interlocuteur dit. ;-)


Je vois encore boost comme un monolithe, ce qui fait que j'ai associé
l'information concernant l'intégration potentielle de boost dans le
standard comme étant totale et non partielle. Désolé pour la confusion,
et merci de m'avoir corrigé.


A mon avis, si on a des bouts qui sont clairs en l'absence de boost, et
qu'on n'obtient pas de fonctionnalite supplementaire, il vaut mieux eviter
boost. Ne serait-ce que parce que boost n'est pas forcement toujours
installee, et qu'il y a quand meme des bouts qui sont fortement indispensables.

Pour la clarte, je ne suis pas du tout convaincu que les chaines de format
a la printf() soient bien, je suis meme plutot convaincu du contraire,
et les manipulateurs de C++ sont quand meme vachement mieux foutus
(en particulier, infiniment plus extensibles, et eventuellement plus
efficaces, puisqu'il n'y a pas de chaine a scanner et rescanner et qu'une
grosse partie du code peut etre inlinee).

Le seul interet que je vois a boost::format, c'est de permettre de convertir
de gros paquets de code existant qui s'appuie lourdement sur des chaines
de format sans avoir a reflechir... mais c'est plus dans une optique `legacy'
qu'autre chose....


James Kanze
Le #1066670
On Feb 4, 12:54 pm, Jean-Marc Bourguet
Mickaël Wolff
quel serait l'équivalent c++ d'un printf("%04x", variable) ?



#include <iomanip>
#include <iostream>

std::cout << std::hex << std::setw(4) << std::setfill('0') << variable;


Dans la pratique, évidemment, on se servira plutôt des fonctions
comme ios::setf() pour écrire ces propres manipulateurs, avec
une sémantique propre à l'application. (Pour des sorties en
hex, par exemple, j'utilise HexFmt, de ma bibliothèque.)

Ou sinon, on se sert des wrappers qui gèrent le format, quelque
chose du genre :
std::cout << percent( someDouble ) ...

(Le cas de hex est peut-être un peu spécial, puisqu'il sert
surtout pour le déboggage---justement pour voir ce qu'il y a
réelement, physiquement, en faisant abstraction de la sémantique
de la valeur dans l'application.)

Tu peux utiliser la bibliothèque boost
se voir intégrer au standard :

std::cout << boost::format("%04x") % variable ;


Il y a des parties de boost qui ont des chances de se
retrouver dans la prochaine norme, mais je ne me souviens pas
avoir vu boost::format dedans.


Je ne crois pas qu'il a été considéré. En général, utilisé com me
ça, il a le même défaut que printf : il melange les informations
de formattage (physique, en plus) dans la chaîne fixe, ce qui
est à éviter.

On peut l'utiliser différemment : je crois que quelque chose
comme :
std::cout << boost::format( "%1%" ) % HexFmt( 4 ) % variable ;
Ce qui est évidemment sans intérêt ici, mais devient intéressant
dans de cas plus réels :
std::cout
<< boost::format( "%1% est à interprété comme %2%" )
% toto( v1 ) % titi( v2 )
<< std::endl ;
où toto et titi, ici, sont des décorateurs qui précisent le
format selon une sémantique qui dépend de l'application.

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



James Kanze
Le #1066669
On Feb 4, 3:44 pm, (Marc Espie) wrote:

Le seul interet que je vois a boost::format, c'est de
permettre de convertir de gros paquets de code existant qui
s'appuie lourdement sur des chaines de format sans avoir a
reflechir... mais c'est plus dans une optique `legacy'
qu'autre chose....


Il y a un deuxième intérêt : il permet à ce que les chaînes
litérales soient d'une étendue plus grande, et donc, qu'elles
soient plus compréhensibles au traducteur. À la place de :

out << "La valeur " << x
<< " a été modifiée par " << y
<< " pour donner " << z << std::endl ;

avec les chaînes détachées "La valeur ", " a été modifiée par "
et " pour donner " qu'on passe sans autre contexte au
traducteur, on a :

out << boost::format(
"La valeur %1% a été modifiée par %2% pour donner %3%" )
% x % y % z
<< std::endl ;

avec une seule chaîne litérale : "La valeur %1% a été modifiée
par %2% pour donner %3%". Crois-moi, un traducteur préfère de
loin le seconde.

(On voit ici, en revanche, le grand défaut de boost::format --
l'utilisation de % à la place de <<. L'opérateur % n'a ni la
bonne précédance, ni surtout l'impact visuel nécessaire.)

Selon la documentation, on peut aussi utiliser des
manipulateurs, en groupant des paramètres :
out << boost::format(
"La valeur %1% a été modifiée par %2% pour donner %3%" )
% group( HexFmt( 4 ), x ) % y % z
<< std::endl ;
À vrai dire, je crois que je préfère de loin un décorateur ici.

Dans certains cas, on pourrait même espérer que la possibilité
de changer la position où chaque paramètre est inséré suffira
pour l'adaptation à une autre langue. (La plupart du temps,
évidemment, il y aurait d'autres considérations que seulement
l'ordre des mots à prendre en compte, et si on veut du texte
grammatiquement correct, on serait amené prèsque toujours à
implémenter un objet chargé dynamiquement avec toutes les
sorties.)

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

Guillaume GOURDIN
Le #1066668
Bonjour à tous,

quel serait l'équivalent c++ d'un printf("%04x") ?


Toujours dans cette idée de formatage de strings, je vois qu'il est
possible de faire

setf( std::ios::hex, std::ios::basefield );
setf( std::ios::dec, std::ios::basefield );
setf( std::ios::oct, std::ios::basefield );

sur un istringstream, mais est-il possible choisir sa base? En
particulier, je voudrais un analyseur qui déchiffrerait un nombre écrit
en base 2.

Merci pour votre aide.

Michel Decima
Le #1066667

sur un istringstream, mais est-il possible choisir sa base? En
particulier, je voudrais un analyseur qui déchiffrerait un nombre écrit
en base 2.


Tu peux utiliser std::bitset<> pour lire/ecrire des nombres en base 2.

James Kanze
Le #1066664
On Feb 5, 11:57 am, Guillaume GOURDIN
quel serait l'équivalent c++ d'un printf("%04x") ?


Toujours dans cette idée de formatage de strings, je vois qu'il est
possible de faire

setf( std::ios::hex, std::ios::basefield );
setf( std::ios::dec, std::ios::basefield );
setf( std::ios::oct, std::ios::basefield );

sur un istringstream, mais est-il possible choisir sa base? En
particulier, je voudrais un analyseur qui déchiffrerait un
nombre écrit en base 2.


Non.

Quand j'ai implémenté une version pré-standard de iostream, j'ai
alloué 6 bits pour basefield, avec ios::hex égal à 16, ios::dec
à 10 et ios::oct à 8 -- en somme, j'utilisais le contenu du
champs comme base (après des vérifications de rigueur,
évidemment -- base 0 fonctionnait comme attendu, base 1
était interdit, de même que des bases supérieur à 36). Donc,
techniquement, il aurait été possible. Mais ni moi ni personne
d'autre n'a fait de proposition, et donc, ça ne fait pas partie
de la norme (et autant que je sache, aucune autre implémentation
ne fait comme ça).

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


Jean-Marc Bourguet
Le #1066663
James Kanze
(après des vérifications de rigueur,
évidemment -- base 0 fonctionnait comme attendu, base 1
était interdit, de même que des bases supérieur à 36).


Quel sens donnes-tu a base 0?

Par contre je vois un sens a base 1 si on admet une difference entre 0 et
pas de chiffre. On ne peut pas representer 0, mais par apres on a par
exemple: 7_{10} = 1111111_{1}. Ce n'est pas tellement different de la
representation alphabetique qui nous avait amuse il y a quelques annees (ou
29 est represente par AC).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Publicité
Poster une réponse
Anonyme