Usando operadores de inserção e controle de formato
Este tópico mostra como controlar o formato e como criar operadores de inserção para suas próprias classes.A inserção (<<) operador, que é pré-programadas para todos os tipos de dados padrão do C++, envia bytes para um objeto de fluxo de saída.Operadores de inserção é trabalhar com predefinido "manipulators," que são elementos que alteram o formato padrão dos argumentos inteiros.
Você pode controlar o formato com as seguintes opções:
Largura da saída
Alinhamento
Precisão
Radix
Largura da saída
Para alinhar a saída, você deve especificar a largura da saída para cada item, colocando o setw manipulator no fluxo ou chamando o largura a função de membro.Este exemplo alinha à direita os valores de uma coluna, pelo menos 10 caracteres:
// 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';
}
}
Saída
1.23
35.36
653.7
4358.24
Espaços em branco à esquerda são adicionados a qualquer valor menos de 10 caracteres de largura.
Para acrescentar um campo, use o preenchimento a função de membro, que define o valor do caractere de preenchimento para campos que tem uma largura especificada.O padrão é um espaço em branco.Para acrescentar a coluna de números com asteriscos, modificar anterior para de loop da seguinte maneira:
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
O endl manipulator substitui o caractere de nova linha ('\n').A saída tem esta aparência:
******1.23
*****35.36
*****653.7
***4358.24
Para especificar as larguras de elementos de dados na mesma linha, use o setw manipulator:
// 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;
}
Saída
O largura a função de membro é declarada em <iostream>.Se você usar setw ou qualquer outro manipulator com argumentos, você deve incluir o <iomanip>.Na saída, seqüências de caracteres são impressos em um campo da largura de 6 e inteiros em um campo da largura de 10:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
Nem setw nem largura trunca valores.Se formatado saída excede a largura, todo o valor for impressa, sujeito a definição da precisão do fluxo.Ambos setw e largura afetam apenas o campo a seguir.Largura do campo será revertido para seu comportamento padrão (a largura necessária) depois que um campo tiver sido impresso.No entanto, as outras opções de formato de fluxo permanecerão em vigor até ser alterado.
Alinhamento
Os fluxos de saída padrão para texto alinhado à direita.Para alinhar à esquerda os nomes no exemplo anterior e alinhar à direita os números, substitua o para de loop da seguinte maneira:
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 ) << names[i]
<< resetiosflags( ios::left )
<< setw( 10 ) << values[i] << endl;
A saída tem esta aparência:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
O sinalizador left-align é definido usando o setiosflags manipulator com o esquerda enumerador.Este enumerador está definido no ios de classe, para que a sua referência deve incluir a ios:: prefixo.O resetiosflags manipulator desativa o sinalizador left-align.Ao contrário do largura e setw, o efeito de setiosflags e resetiosflags é permanente.
Precisão
O valor padrão para a precisão de ponto flutuante é seis.Por exemplo, o número 3466.9768 imprime como 3466.98.Para alterar a maneira como esse valor imprime, use o setprecision manipulator.O manipulator tem dois sinalizadores: fixa e científicos.Se fixa for definido, o número impresso como 3466.976800.Se científicos esteja configurado, ele será impresso como 3.4669773 + 003.
Para exibir os números de ponto flutuante mostrados na Alinhamento com um dígito significativo, substituir o para de loop da seguinte maneira:
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;
O programa imprime nesta lista:
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
Para eliminar a notação científica, inserir essa instrução antes do para loop:
cout << setiosflags( ios::fixed );
Com a notação de ponto fixa, o programa imprime com um dígito depois do ponto decimal.
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
Se você alterar o ios::fixed sinalizador para ios::scientific, o programa imprime isso:
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
Novamente, o programa imprime um dígito depois do ponto decimal.Se qualquer um dos ios::fixed ou ios::scientific estiver definida, o valor de precisão determina o número de dígitos após o ponto decimal.Se nenhum sinalizador estiver definido, o valor de precisão determina o número total de dígitos significativos.O resetiosflags manipulator limpa esses sinalizadores.
Radix
O dec, out, e hexadecimal manipulators definir a base padrão para entrada e saída.Por exemplo, se você inserir o hexadecimal manipulator no fluxo de saída, o objeto corretamente converte a representação de dados internos de inteiros em um formato de saída hexadecimal.Os números são exibidos com dígitos a até f em letras minúsculas se a maiúsculas sinalizador estiver desmarcada (padrão); Caso contrário, elas são exibidas em letras maiúsculas.A base padrão é dec (decimal).