Utilisation des opérateurs d'insertion et le format de contrôle
Cette rubrique indique comment utiliser le format de contrôle et comment créer des opérateurs d'insertion pour vos propres classes.L'opérateur d'insertion (d'<<), qui est préprogrammé pour tous les types de données C++ standard, envoie des octets en un objet de flux de sortie.Travail d'insertion d'opérateurs avec les « manipulateurs prédéfinis, » qui sont des éléments qui modifient le format par défaut des arguments de type entier.
vous pouvez contrôler le format avec les 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 de données ou en appelant la fonction membre de width .Cet exemple droit-aligne les valeurs d'une colonne au moins 10 caractères :
// 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
Menant les espaces sont ajoutés à n'importe quelle valeur inférieure à 10 caractères.
Pour compléter un champ, utilisez la fonction membre de remplissage , qui définit la valeur du caractère de remplissage pour les champs qui ont une largeur spécifiée.la valeur par défaut est un espace.Pour terminer la colonne les nombres avec des 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').La sortie présente l'aspect suivant :
******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 de width est <iostream> déclaré.Si vous utilisez setw ou tout autre manipulateur avec des arguments, vous devez inclure <iomanip> .Dans la sortie, les chaînes sont imprimées dans un domaine d'une largeur de 6 et des entiers dans un domaine d'une largeur de 10 :
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
Ni setw ni width ne tronque les valeurs.Si la sortie mise en forme dépasse la largeur, les copies complètes de valeur, en fonction de le paramètre de la précision du flux de données.setw et width affectent le champ suivant uniquement.La largeur du champ revient à son comportement par défaut (la largeur nécessaire) après qu'un champ a été imprimé.Toutefois, les autres options de format de flux demeurent effectives jusqu'à modifié.
Alignement
valeur par défaut de flux de sortie au texte aligné à droite.À l'inscription à gauche des noms dans l'exemple précédent et droit-alignent les nombres, 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 ) << values[i] << endl;
La sortie présente l'aspect suivant :
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
La balise d'inscription à gauche est défini à l'aide de le manipulateur de setiosflags avec l'énumérateur de gauche .Cet énumérateur est défini dans la classe d' IOS , ses référence doit inclure le préfixe d' IOS : : .Le manipulateur de resetiosflags désactive l'indicateur d'inscription à gauche.Contrairement à width et d' setw, l'effet d' setiosflags et d' resetiosflags est définitive.
Précision
la valeur par défaut pour la précision de virgule flottante est six.Par exemple, les copies du nombre 3466,9768 sous la forme 3466,98.Pour modifier la façon dont cette valeur imprime, utilise le manipulateur de setprecision .le manipulateur a deux balises : fixe et scientifique.Si fixe est défini, les copies de nombres sous la forme 3466,976800.Si scientifique est défini, il affiche comme 3.4669773+003.
Pour afficher les nombres à virgule flottante affichés dans Inscription par 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 imprime cette liste :
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
Pour éviter la notation scientifique, insérez cette instruction avant que la boucle de pour :
cout << setiosflags( ios::fixed );
Avec la notation fixe, les copies de programme par un chiffre après la virgule décimale.
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
Si vous modifiez la balise d' IOS : : fixe à IOS : : scientifique, le programme imprime ce qui suit :
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
De même, le programme imprime un chiffre après la virgule décimale.Si IOS : : fixe ou IOS : : scientifique est défini, la valeur de précision indique le nombre de chiffres après la virgule décimale.Si aucune de ces indicateur n'est défini, la valeur de précision détermine tout le nombre de chiffres significatifs.le manipulateur d' resetiosflags désactive ces balises.
base
décembre, oct., et les manipulateurs de hexadécimal définissent la base par défaut pour l'entrée et la sortie.Par exemple, si vous insérez le manipulateur de hexadécimal dans le flux de sortie, l'objet traduit correctement la représentation des données interne des entiers dans un format de sortie hexadécimal.Les nombres sont restitués avec les chiffres a à f en minuscule si la balise de majuscules n'est pas sélectionnée (valeur par défaut) ; sinon, ils sont affichés en majuscules.La base par défaut est décembre (décimal).