Formatage des streams

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Grasshoper
Le #6405921
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

Guillaume GOURDIN
Le #6405911
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... :-/


pjb
Le #6406731
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... :-/


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__



James Kanze
Le #6407081
On Apr 25, 2:49 pm, Guillaume GOURDIN
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

Publicité
Poster une réponse
Anonyme