Indicateurs de format

Les flots permettent un grand nombre de formatages des données. Il existe un champ de format dans ios, et une liste de masques unitaires qui lui correspondent, dont voici la signification lorsqu’ils sont à 1 dans ce champ :

ios::skipws Supprime les espaces (blancs, tabulations, etc.) en lecture. Ce bit est à 1 par défaut, contrairement aux autres.
ios::left Ajustement à gauche en écriture.
ios::right Ajustement à droite en écriture.
ios::internal Remplissage après le signe + ou -, ou l’indicateur de base (et non avant).
ios::dec Écriture décimale (base 10).
ios::oct Écriture en octal (base 8).
ios::hex Écriture en hexadécimal (base 16).
ios::showbase En écriture, écrire un indicateur de base.
ios::showpoint Écrit obligatoirement le point décimal pour les nombres à virgule flottante, même si toutes les décimales sont nulles.
ios::uppercase Écrit les lettres A à F en majuscules dans les chiffres hexadécimaux (minuscules sinon).
ios::showpos Écrit le signe pour tous les entiers, même positifs.
ios::scientific Pour les nombres à virgule flottante, écriture en notation scientifique (1.75e+01 par exemple).
ios::fixed Pour les nombres à virgule flottante, écriture en notation à virgule flottante (17.5 avec le même exemple).
ios::unitbuf Vide les tampons après écriture.
ios::stdio Vide les tampons de sortie standard out et de sortie d’erreur err après insertion.

Le champ de format peut être lu par la méthode long flags(void) et modifié par long flags(long). Deux autres méthodes peuvent être utilisées aussi dans ce but. La méthode long unsetf(long) met à zéro les bits du champ de format qui valent 1 dans son argument. La méthode long setf(long) a l’effet contraire. Mais on utilisera surtout long setf(long, long) ; le premier argument indique la nouvelle valeur des bits à modifier ; le deuxième argument indique les bits à modifier effectivement (ceux à 1 ; ceux à 0 ne sont pas changés), et peut être pris dans la liste de constantes suivante :

ios::basefield égal à ios::dec | ios::oct | ios::hex
ios::adjustfield égal à ios::left|ios::right|ios::internal
ios::floatfield égal à ios::scientific | ios::fixed

Par exemple

f.setf(ios::uppercase|ios::hex, ios::uppercase|ios::basefield);

change les bits de base d’écriture et de uppercase afin d’écrire les entiers en hexadécimal avec des lettres majuscules pour les chiffres A à F.

Trois autres champs de formatage peuvent être utilisés. Le champ de largeur indique sur combien de caractères de large la donnée doit être écrite ; si la donnée est plus petite, la partie restante est remplie avec le caractère de remplissage ; si elle est trop grande elle n’est pas tronquée. Ce champ est remis à zéro après chaque opération formatée. Il peut être lu par la méthode int width(void) et modifié par int width(int) (qui renvoie la valeur précédente).

Le champ de remplissage indique quel caractère est utilisé pour le remplissage lorsqu’il y en a un. Par défaut, c’est l’espace blanc qui est utilisé. Ce champ peut être lu par char fill(void) et modifié par char fill(char).

Le champ de précision indique combien de décimales sont écrites au maximum dans les nombres à virgule flottante. Par défaut, le plus grand nombre de décimales significatives est écrit. Ce champ peut être lu par int precision(void) et modifié par int precision(int).

L’ensemble de ces champs de formats donne un nombre de possibilités très impressionnant, et qu’il est exclu de passer entièrement en revue. Voici simplement quelques exemples :

int i = 245;double d = 75.8901;cout.precision(2);cout.setf(ios::scientific, ios::floatfield);cout << d;    // écrit 7.59e+01cout.width(7);cout.fill('$');cout << i;    // écrit $$$$245cout.width(9);cout.fill('#');cout.setf(ios::left|ios::hex,         ios::adjustfield|ios::basefield);cout << i;    // écrit f5#######cout.fill(' ');cout.width(6);cout.setf(ios::internal|ios::showpos|ios::dec,     ios::adjustfield|ios::showpos|ios::basefield);cout << i;    // écrit + 245

Cette notation n’est pas très pratique, une meilleure sera indiquée plus loin (paragraphe sur les manipulateurs).

Précédent Précédent Sommaire Sommaire Suivant Suivant