Mise en forme avec i / o manipulateurs flux

Une des difficultés avec C ++ dans le déplacement pour écouter des objets pour la sortie est d'apprendre à formater la sortie. Il ya en fait deux façons de formater flux E / S.

Sommaire

La première technique que les programmeurs normalement apprendre est à travers des appels de méthode directe. Par exemple, l'appel suivant définit le flux de sortie en mode hexadécimal sorte que entiers apparaissent à l'écran sous forme de valeurs hexadécimaux plutôt que des valeurs comme décimales:

ios :: fmtflags prev = cout.setf (ios :: hex, ios :: BASEFIELD) -

Ici, le setf () méthode définit les drapeaux de format en première masquant les bits dans le second argument, puis en définissant les bits indiqués par le premier argument. La fonction retourne l'ancienne valeur de sorte que la fonction d'appel peut rétablir les drapeaux de format avant de revenir.

Dans la pratique, cette fonction se présente comme suit:

#comprendre using namespace std - // displayHex - afficher un nombre en hexadécimal formatvoid displayHex (ostream out, int n) {ios :: fmtflags prev = out.setf (ios :: hex, ios :: BASEFIELD) départ privé lt; lt; n-out.setf (prev) -} int main () {int n = 0x1234-cout lt; lt; "n =" lt; lt; n lt; lt; endl-cout lt; lt; "n en hexadécimal est" -displayHex (cout, n) -cout lt; lt; endl-retour 0-}

Le programme commence en définissant la variable n à une valeur hexadécimale. Il affiche ensuite la valeur à cout. Elle appelle ensuite la displayHex () fonction pour afficher la valeur au format hexadécimal. La sortie du programme apparaît comme suit:

n = 4660n en hexadécimal est 1234

La valeur au format décimal est pas reconnaissable, mais l'affichage hexadécimal est clairement la valeur utilisée pour initialiser n.

Cependant, C ++ fournit une deuxième façon de contrôler I / O format: manipulateurs d'E / S.

Qu'est-ce qu'un manipulateur I / O?

Un I / O manipulateur Un but que le programmeur peut insérer dans le flux de sortie d'invoquer les fonctions de commande de format. L'extrait de code suivant illustre l'utilisateur de manipulateurs d'E / S. Il effectue la même fonction que l'extrait précédent, sauf que cette version utilise un manipulateur I / O pour appeler le setf () fonction:

#comprendre #comprendre using namespace main () {int n = 0x1234-cout de std-int lt; lt; "n =" lt; lt; n lt; lt; endllt; lt; "n en hexadécimal est" lt; lt; SETBASE (16) lt; lt; n lt; lt; endl-retour 0-}



Ici main () premier n sorties comme une valeur décimale. Il utilise ensuite la SETBASE (16) manipulateur de changer la base de visualisation de décimal (base 10) en hexadécimal (base 16) avant d'afficher à nouveau la valeur. La sortie de cette version est indiscernable de la version antérieure:

n = 4660n en hexadécimal est 1234

La SETBASE (16) objet apparaît comme un appel à une fonction dans le milieu du courant de sortie. Le fait qu'un objet est en cours de création est invisible à l'utilisateur.

Pour hexadécimal, octal et décimal, C ++ fournit les raccourcis hex, octobre et décembre ce qui signifie que le code pourrait prendre la forme encore plus courte suivante:

cout lt; lt; "n =" lt; lt; n lt; lt; endllt; lt; "n en hexadécimal est" lt; lt; hex lt; lt; n lt; lt; endl-

Qu'est-ce que les manipulateurs d'E / S ne C ++ offre?

Jetez un oeil à ce tableau, qui contient une liste des manipulateurs d'E / S disponibles pour C ++ de 2011.

Manipulateurs E / S courantes
I / O ManipulateurFonction
boolalpha
noboolalpha
Bascule entre textuelle et l'affichage numérique d'une valeur booléenne. Quandboolalpha est réglé, vrai et faux que appearonscreen 'vrai' et 'faux». Quand il ne soit pas réglé, ils apparaissent comme des '1»Et« 0 ».
ShowBase
noshowbase
Quand ShowBase est réglé, octal valuesare précédée par un 0 et hexadecimalvalues ​​sont précédés par '0x' ou '0X».
showpoint
noshowpoint
Un point décimal est toujours affiché lorsque showpoint est réglé.
showpos
noshowpos
Affiche une '+' signer des valeurs ofpositive avant lorsque showpos est set.Displays rien quand noshowpos isset.
skipws
noskipws
Saute espace blanc sur l'entrée.
majuscule
nouppercase
Si majuscule est réglé, ensuite useuppercase pour les formats de sortie, par exemple, '0X'Pour la sortie hexadécimal. Si nouppercase est réglé, utilisez minuscules, par exemple,'0x'Pour la sortie hexadécimal.
unitbuf
nounitbuf
Si elle est définie, la sortie ne soit pas tamponné mais rincé après eachinsert. Sinon, la sortie est tamponnée.
fixé
scientifique
Réglez la sortie des valeurs à virgule flottante à la notation soit orscientific fixe.
wsCet objet mange espace blanc à partir d'un flux d'entrée.
extrémitésInsère un caractère nul (' 0') Dans un flux sortant. Utile pour null de terminaison d'une chaîne lors de l'utilisation ostrstream.
flushEfface les caractères du tampon au flux de sortie.
endlInsère un caractère de nouvelle ligne.
setiosflags(n)
resetiosflags(n)
Cochez ou décochez la ios drapeaux enmasse.
SETBASE (n)Définit la base pour l'entrée et la sortie entier à 8, 10, 16 ou texte 0.See pour explication de 0.
décembre

octobre
hex
Réglez la base en décimal, octal ou hexadécimal.
Raccourci pour SETBASE (10), SETBASE (8), et SETBASE (16), respectivement.
setfill (c)Définit le caractère utilisé pour remplir l'espace lorsque le nombre ofcharacters à afficher est inférieure à la largeur du champ. Le defaultcharacter est un espace.
SetPrecision (n)Définit le nombre de chiffres à la sortie lors de l'affichage Numéro afloating point.
setw (n)Réglage de la largeur minimale de la trame de sortie suivante. Le champ IsExpanded avec setfill () asnecessary caractères.
setfill (c)Définit le caractère utilisé pour remplir l'espace lorsque le nombre ofcharacters à afficher est inférieure à la largeur du champ. Le defaultcharacter est un espace.


interne
gauche
droit
Réglez le placement des caractères de remplissage. Si le remplissage characterwere '*' (par exemple), alors:
interne -"$ 123.00 **"
gauche - "** $ 123,00"
droit - "123,00 $ **"
Gagner de l'argent()
put_money ()
Lire ou afficher une valeur monétaire, en utilisant les règles locales comme Défini par localité. (Ceci est pas implémentée dans la version actuelle ofgcc.)
get_time ()
put_time ()
Lire ou afficher une heure ou la date, en utilisant les règles locales en tant que jeu bylocale. (Ceci est pas implémentée dans la version actuelle ofgcc.)

La plupart des manipulateurs sont simples. Cependant quelques-uns nécessitent quelques explications,. Par exemple, en ce qui concerne la SETBASE () manipulateur, toutes les valeurs de base sont pris en charge. En fait, C ++ prend en charge uniquement décimal, octal et hexadécimal I / O - ce qui est correct, que celui est à peu près tout ce qu'il faut. Vous pouvez, toutefois, de définir la base de 0 - en fait, 0 est la valeur par défaut.

Réglage de la base à 0 est la même chose que lui à la décimale pour la sortie. Pour l'entrée, cependant, fixation de l'assiette à 0 signifie «extraire la base du nombre lui-même". Les règles pour le faire sont les suivantes:

  • # 42 Si un numéro commence par 0x ou 0X, il est supposé être hexadécimal.

  • # 42 Si un certain nombre commence avec seulement 0, alors il est supposé être octal.

  • # 42 Sinon, le nombre est considéré comme décimal.

Le programme simple suivant illustre ces règles:

#comprendre #comprendre using namespace main () {int n1, n2, n3-cin >> SETBASE (0) >> >> n1 n2 >> n3-cout de std-int lt; lt; ShowBase lt; lt; SETBASE (16) lt; lt; "= N1» lt; lt; n1 lt; lt; "," N2 = lt; lt; n2lt; lt; ", N3 =" lt; lt; n3 lt; lt; endl-retour 0-}

La première ligne définit la base pour la cin opposer à 0 et extrait ensuite trois entiers. La deuxième ligne affiche ces trois entiers au format hexadécimal. La ShowBase manipulateur provoque le leader '0x' à afficher des valeurs hexadécimaux. Le tableau suivant montre un exemple de l'exécution de ce programme, où les trois numéros en gras sont des valeurs que je entrée à partir du clavier:

10 010 0x10n1 = 0xa, n2 = 0x8, n3 = 0x10

Vous pouvez voir que le premier numéro a été interprété comme 10 en base 10, qui est 0xA en hexadécimal. Le deuxième numéro a été interprété comme 10 en base 8, qui est 8 en hexadécimal. Le troisième et dernier numéro a été interprété comme 10 en hexadécimal.

Un autre manipulateur qui mérite une mention spéciale est le setw (), abréviation de «largeur set". Ceci définit la largeur d'affichage minimum de champ suivant affiché. Le programme simple suivant montre comment setw ()interagit avec un rembourrage et le caractère de remplissage:

#comprendre #comprendre using namespace std-int main () {int largeur int valeur cout lt; lt; "Saisissez la largeur:" - cin >> largeur cout lt; lt; setfill ('*') - pour (-) {cout lt; lt; "Entrez une valeur:" - cin >> valeur si (valeur == 0) {} percée cout lt; lt; "Gauche, Droite et interne: n" lt; lt; gauche lt; lt; setw (largeur) lt; lt; valeur lt; lt; "," Lt; lt; rightlt; lt; setw (largeur) lt; lt; valeur lt; lt; "," Lt; lt; interne lt; lt; setw (largeur) lt; lt; valeur lt; lt; endl-} return 0-}

Ce programme définit le caractère de remplissage '*' (la valeur par défaut est l'espace). Il lit ensuite la largeur à utiliser pour tous les numéros sur le clavier avant d'entrer dans une boucle qui lit et affiche les valeurs. Dans cette boucle, le programme affiche d'abord le nombre de gauche; remplissage de la main, puis avec droit; remplissage de la main, et enfin avec remplissage interne.

Ce qui suit est un exemple d'exécution du programme avec l'entrée en caractères gras:

Entrez la largeur:5Entrez une valeur:100000Gauche, Droite et interne: 100000, 100000, 100000Enter une valeur:100Gauche, droite et intérieure: 100 **, ** 100 ** 100Enter une valeur:-100Gauche, Droite et interne: -100 *, * -100, - * 100Enter une valeur:0

Voici 5 est entré comme la largeur du champ. Cependant, la première valeur entrée, 100 000, nécessite plus de 5 colonnes à afficher si aucun des champs d'affichage eu un effet quelconque. La largeur de consigne définit uniquement la largeur minimale à afficher.

La valeur suivante entrée, 100, ne nécessite que trois colonnes à afficher, de sorte que le programme affiche la valeur d'abord avec deux * caractères sur la droite, puis à gauche, et de nouveau à gauche.

La valeur suivante est entré, -100, démontre la différence entre droite et remplissage remplissage interne. Droit remplissage mis le caractère de remplissage sur la gauche de la valeur, y compris le signe moins. Remplissage interne mis le caractère de remplissage entre la valeur et le signe moins. Ceci fonctionne également pour un signe plus lorsque plus est forcé sur la showpos manipulateur et entre le nombre et le signe de devises (quand la monnaie est pris en charge par le compilateur).

Les manipulateurs ne pas ajouter toute capacité qui ne sont pas déjà présents. Après tout, chacun de ces manipulateurs finit par appeler une méthode publique sur l'objet de flux. Toutefois, elles fournissent un moyen commode de mise en forme d'E / S.


» » » » Mise en forme avec i / o manipulateurs flux