Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Equivalent printf

20 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

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

Merci pour votre aide.

10 réponses

1 2
Avatar
Mickaël Wolff
Bonjour à tous,


Bonjour,

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


Tu peux utiliser la bibliothèque boost
<http://www.boost.org/libs/format/index.html> qui a de forte chance de
se voir intégrer au standard :

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


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

Avatar
Jean-Marc Bourguet
Mickaël Wolff writes:

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
<http://www.boost.org/libs/format/index.html> qui a de forte chance de
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


Avatar
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.


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

Avatar
espie
In article <47a71e73$0$1932$,
Mickaël Wolff wrote:

#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....


Avatar
James Kanze
On Feb 4, 12:54 pm, Jean-Marc Bourguet wrote:
Mickaël Wolff writes:
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
<http://www.boost.org/libs/format/index.html> qui a de forte chance de
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



Avatar
James Kanze
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

Avatar
Guillaume GOURDIN
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.

Avatar
Michel Decima

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.

Avatar
James Kanze
On Feb 5, 11:57 am, Guillaume GOURDIN wrote:
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


Avatar
Jean-Marc Bourguet
James Kanze writes:

(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

1 2