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

Formatage des streams

4 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

une petite question me tarude : quand j'écris quelques chose du style

cout << hex << setwidth( 2 ) << setfill( 0 );

est-ce que le formattage est définitivement changé et n'est-il valable
que pour la prochaine insertion? Et y a t'il justement un moyen de
changer de manière définitive ou au contraire temporaire le formatage
d'un stream?

Merci.

4 réponses

Avatar
Grasshoper
25/04/2008 14:49 - Guillaume GOURDIN :
est-ce que le formattage est définitivement changé et n'est-il valable
que pour la prochaine insertion? Et y a t'il justement un moyen de
changer de manière définitive ou au contraire temporaire le formatage
d'un stream?


Pour autant que je puisse dire, ce tableau est juste :
http://cpp.developpez.com/faq/cpp/?page=SL#SL_stream_iomanip

Avatar
Guillaume GOURDIN
Grasshoper wrote:
25/04/2008 14:49 - Guillaume GOURDIN :
est-ce que le formattage est définitivement changé et n'est-il valable
que pour la prochaine insertion? Et y a t'il justement un moyen de
changer de manière définitive ou au contraire temporaire le formatage
d'un stream?


Pour autant que je puisse dire, ce tableau est juste :
http://cpp.developpez.com/faq/cpp/?page=SL#SL_stream_iomanip


Merci! Y a t'il une raison particuliere pour que setw ne soit pas
persistant? Je ne trouve pas ça très pratique, en effet, je voudrais un
affichage du type :

0x00 0x01 0x02 0x03 0x04...

ce qui implique que je vais devoir ajouter un 'setw(2)' avant chaque
insertion... :-/


Avatar
pjb
Guillaume GOURDIN writes:

Grasshoper wrote:
25/04/2008 14:49 - Guillaume GOURDIN :
est-ce que le formattage est définitivement changé et n'est-il
valable que pour la prochaine insertion? Et y a t'il justement un
moyen de changer de manière définitive ou au contraire temporaire
le formatage d'un stream?
Pour autant que je puisse dire, ce tableau est juste :

http://cpp.developpez.com/faq/cpp/?page=SL#SL_stream_iomanip


Merci! Y a t'il une raison particuliere pour que setw ne soit pas
persistant? Je ne trouve pas ça très pratique, en effet, je voudrais
un affichage du type :

0x00 0x01 0x02 0x03 0x04...

ce qui implique que je vais devoir ajouter un 'setw(2)' avant chaque
insertion... :-/


Par défaut, le formatage se fait avec une largeur variable ajusté à
chaque objet imprimé.

Si setw() était persistent, il faudrait pouvoir spécifier cette
largeur variable, soit en utilisant une valeur spéciale (pas trop
ragoutant), soit en créant une méthode spéciale resetw() (je suppose
que les programmeurs de la stl étaient trop faignant pour ça), soit en
surchargeant la méthode:
class default{public:default(){}};
... setw(const default&){...} ...
aussi assez laborieux à définir, même si ce serait assez facile à utiliser:
cout<<setw(default());

Et il faut aussi voir comment on l'utiliserait le plus souvent. Prenons ton exemple:

cout<<hex()<<setw(8)<<" 0x"<<val[0]<<" 0x"<<val[1]<<endl;

donnerait:
|
| 0x FDECBA98 0x 76543210
|
puisque setw(8) s'appliquerait aussi aux " 0x".

Il faudrait alors écrire:

cout<<hex()<<resetw()<<" 0x"<<setw(8)<<val[0]<<resetw()<<" 0x"<<setw(8)<<val[1]<<endl;

ce qui serait plus fastidieux.



--
__Pascal Bourguignon__



Avatar
James Kanze
On Apr 25, 2:49 pm, Guillaume GOURDIN wrote:

une petite question me tarude : quand j'écris quelques chose du style

cout << hex << setwidth( 2 ) << setfill( 0 );

est-ce que le formattage est définitivement changé et n'est-il
valable que pour la prochaine insertion?


S'il s'agit là de std::setfill ou std::hex, c'est permanent.
S'il s'agit des manipulateurs personels, ça dépend de comment tu
les as écrits -- typiquement, on fait en sort que les effets
persistent jusqu'à la fin de l'expression complète.

Et y a t'il justement un moyen de changer de manière
définitive ou au contraire temporaire le formatage d'un
stream?


Plus ou moins. Tous les attributes de formattage sauf la taille
(width) persiste. Donc, si tu fais :
std::cout.setf( std::ios::hex, std::ios::basefield ) ;
, ça persiste. En revanche, normalement, on écrit ces propres
manipulateur de façon à ce que le destructeur résitue l'état
antérieur ; on écrirait donc :
std::cout << HexFmt( 2 ) << valeur ;
et le manipulateur laisse std::cout comme il l'a trouvé (mais on
peut écrire:
HexFmt hex( 2 ) ;
std::cout << hex << v1 << std::endl ;
std::cout << hex << v2 << std::endl ;
etc. ; le format serait rétabli quand hex est détruit).

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