Utilisation des opérateurs d'insertion et contrôle du format
Cette rubrique explique comment le format de contrôle et comment créer les opérateurs d'insertion pour vos propres classes. L'opérateur insert (<<), qui est préprogrammé pour tous les types de données standard C++, envoie des octets à un objet de flux de sortie. Les opérateurs insert fonctionnent avec des « manipulateurs prédéfinis, » qui sont des éléments qui modifient le format par défaut des arguments entiers.
Vous pouvez contrôler le format des options suivantes :
Largeur de sortie
Alignement
Précision
Base
Largeur de sortie
Pour aligner la sortie, vous spécifiez la largeur de sortie pour chaque élément en plaçant le manipulateur d'setw dans le flux ou en appelant la fonction membre du width. Cet exemple droit aligne les valeurs d'une colonne au moins 10 caractères de large :
// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width(10);
cout << values[i] << '\n';
}
}
Sortie
1.23
35.36
653.7
4358.24
Les espaces de début sont ajoutés à une valeur inférieure à 10 caractères de large.
Pour effectuer un champ, utilisez la fonction membre du fill, qui définit la valeur de caractère de remplissage des champs qui ont une largeur spécifiée. La valeur par défaut est un vide. Pour terminer la colonne de nombres avec les astérisques, modifiez la boucle précédente de pour comme suit :
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
Le manipulateur d'endl remplace le caractère de saut de ligne ('\n'). Voici un exemple de la syntaxe utilisée :
******1.23
*****35.36
*****653.7
***4358.24
Pour spécifier des largeurs des éléments de données dans la même ligne, utilisez le manipulateur d'setw :
// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 6 ) << names[i]
<< setw( 10 ) << values[i] << endl;
}
Sortie
La fonction membre du width est déclarée dans <l'iostream>. Si vous utilisez setw ou tout autre manipulateur avec les arguments, vous devez inclure <l'iomanip>. Dans le résultat, les chaînes sont imprimées dans un domaine de la largeur 6 et des entiers dans un domaine de la largeur 10 :
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
Ni ni setwwidth ne tronque les valeurs. Si le résultat mis en forme dépasse la largeur, les sauvegardes de valeurs entières, en fonction de la valeur de la précision du flux de données. setw et width affectent le champ suivant uniquement. La largeur du champ est rétablie à son comportement par défaut (la largeur nécessaire) lorsqu'un champ a été écrit. Toutefois, les autres options de format de flux reste effective jusqu'à modifier.
Alignement
Les flux de sortie sont accordées par défaut au texte aligné à droite. À l'inscription à gauche des étiquettes dans l'exemple précédent et droit aligner les nombres, remplacer la boucle de pour comme suit :
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 ) << names[i]
<< resetiosflags( ios::left )
<< setw( 10 ) << values[i] << endl;
Voici un exemple de la syntaxe utilisée :
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
L'indicateur d'alignement à gauche est définie à l'aide de manipulateur d'setiosflags avec l'énumérateur d'gauche. Cet énumérateur est défini dans la classe d'entrées/sorties, et sa référence doit inclure le préfixe d'ios::. Le manipulateur d'resetiosflags désactive l'indicateur d'alignement à gauche. Contrairement à width et d'setw, le résultat d'setiosflags et d'resetiosflags est définitive.
Précision
La valeur par défaut de la précision à virgule flottante a six. Par exemple, les sauvegardes le numéro 3466,9768 3466,98. Pour modifier la façon dont cette valeur affiche, utilise le manipulateur d'setprecision. Le manipulateur deux indicateurs : définit et scientifique. Si définit est défini, les sauvegardes de numéro 3466,976800. Si scientific est défini, il imprime comme 3.4669773+003.
Pour afficher les nombres à virgule flottante affichés dans Alignement avec un chiffre significatif, remplacez la boucle de pour comme suit :
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 )
<< names[i]
<< resetiosflags( ios::left )
<< setw( 10 )
<< setprecision( 1 )
<< values[i]
<< endl;
Le programme envoie cette liste :
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
Pour éliminer la notation scientifique, insérez l'instruction avant que la boucle d'pour :
cout << setiosflags( ios::fixed );
Avec la notation fixe, les sauvegardes de programme avec un chiffre après la virgule.
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
Si vous remplacez l'indicateur d'ios::fixed à ios::scientific, le programme envoie ce qui suit :
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
Là encore, l'outil affiche un chiffre après la virgule. Si ios::fixed ou ios::scientific est défini, la valeur de précision détermine le nombre de chiffres après la virgule. Si ni l'une ni l'autre d'indicateur n'est définie, la valeur de précision détermine le nombre de chiffres significatifs. Le manipulateur d'resetiosflags désactive ces indicateurs.
Base
dec, oct, et les manipulateurs de hex définissent la radix par défaut pour l'entrée et la sortie. Par exemple, si vous insérez le manipulateur de hex dans la sortie, l'objet traduit correctement la représentation des données interne des entiers dans un format de sortie hexadécimal. Les nombres sont affichés avec les données a à f en lettres minuscules si l'indicateur d'majuscules claire est (valeur par défaut) ; sinon, ils s'affichent en majuscules. La radix par défaut est dec (décimal).