Compartilhar via


Usando operadores de inserção e controlando o formato

Este tópico mostra como o formato de controle e como criar operadores de inserção para suas próprias classes. O operador insert (<<), que preprogrammed para todos os tipos de dados padrão do C++, envia bytes a um objeto do fluxo de saída. Os operadores de inserção funcionam com os manipuladores “,” predefinidos que são elementos que modificam o formato padrão de argumentos inteiros.

Você pode controlar o formato com as seguintes opções:

  • Largura de saída

  • Alinhamento

  • Precisão

  • Raiz

Largura de saída

Para alinhar saída, especifique a largura de saída para cada item colocando o manipulador de setw no fluxo ou chamando a função de membro de width . Este exemplo ele alinha os valores em uma coluna pelo menos 10 caracteres de comprimento:

// 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

Os espaços em branco à esquerda são adicionadas como qualquer valor menor que 10 caracteres de largura.

Para preencher um campo, use a função de membro de fill , que define o valor de caractere de preenchimento para os campos que têm uma largura especificada. A opção é um espaço em branco. Para preencher a coluna de números com asteriscos, modifique o loop anterior de for como segue:

for( int i = 0; i < 4; i++ )
{
   cout.width( 10 );
   cout.fill( '*' );
   cout << values[i] << endl;
}

O manipulador de endl substitui o caractere de nova linha ('\n'). Os aspectos de saída tem a seguinte aparência:

******1.23
*****35.36
*****653.7
***4358.24

Para especificar larguras de elemento de dados na mesma linha, use o manipulador de 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;
}

Saída

A função de membro de width é <declarado em>iostream. Se você usar setw ou qualquer outro manipulador com argumentos, você deve incluir <o iomanip>. Na saída, as cadeias de caracteres são impressas no campo de largura e 6 de inteiros no campo de largura 10:

  Zoot      1.23
 Jimmy     35.36
    Al     653.7
  Stan   4358.24

Nem setw ou width truncam valores. Formatado se a saída ultrapassar a largura, as cópias do valor, sujeita à configuração da precisão do fluxo. setw e width afetam o próximo campo somente. A largura de 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 permanece em vigor até alterado.

Alinhamento

Os fluxos de saída usam como padrão o texto alinhado à direita. Deslocamento para alinhar os nomes no exemplo anterior e a alinhar os números, substitua o loop de for como segue:

for ( int i = 0; i < 4; i++ )
   cout << setiosflags( ios::left )
        << setw( 6 )  << names[i]
        << resetiosflags( ios::left )
        << setw( 10 ) << values[i] << endl;

Os aspectos de saída tem a seguinte aparência:

Zoot        1.23
Jimmy      35.36
Al         653.7
Stan     4358.24

O sinalizador sem-recuo alinhar é definido usando o manipulador de setiosflags com o enumerador de esquerdo . Esse enumerador é definido na classe de ios , de modo que a referência deve incluir o prefixo de ios:: . O manipulador de resetiosflags desativa o sinalizador sem-recuo alinhados. Ao contrário de width e de setw, o efeito de setiosflags e de 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 que esse valor imprime, usa o manipulador de setprecision . O manipulador tem dois sinalizadores: fixo e científico. Se fixo for definido, o número será impresso como 3466,976800. Se scientific for definido como, imprime 3.4669773+003.

Para exibir os números de pontos flutuantes mostrados em Alinhamento com um dígito significante, substitua o loop de for como segue:

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 esta lista:

Zoot          1
Jimmy     4e+001
Al        7e+002
Stan      4e+003

Para eliminar a notação científica, insira esta instrução antes que o loop de for :

cout << setiosflags( ios::fixed );

Com notação fixa, o programa imprime com um dígito após o ponto decimal.

Zoot         1.2
Jimmy       35.4
Al         653.7
Stan      4358.2

Se você alterar o sinalizador de ios::fixed a ios::scientific, o programa imprime este:

Zoot    1.2e+000
Jimmy   3.5e+001
Al      6.5e+002
Stan    4.4e+003

Além disso, o programa imprime um dígito após o ponto decimal. Se ios::fixed ou ios::scientific são definidos, o valor de precisão determina o número de dígitos após o ponto decimal. Se nenhum sinalizador é definido, o valor de precisão determina o número total de dígitos significativos. O manipulador de resetiosflags limpa esses sinalizadores.

Raiz

dec, oct, e os manipuladores de hex definem a raiz padrão para entrada e saída. Por exemplo, se você inserir o manipulador de hex no fluxo de saída, o objeto corretamente converte a representação de dados internos de inteiros em um formato hexadecimal de saída. Os números são exibidos com dígitos à f em minúsculas se o sinalizador de maiúsculas estiver claro (o padrão); se não, são exibidos em maiúscula. A raiz padrão é dec (decimal).

Consulte também

Referência

Fluxos de Saída