Formatação com i fluxo o manipuladores /

Uma das dificuldades com C ++ em mover-se para transmitir objetos para a saída é aprender a formatar a saída. Na verdade, existem duas maneiras de formatar-stream E / S.

Video: Formatação Completa do PC e fazer Espelhamento de S.O - TecRatão

A primeira técnica que os programadores normalmente aprender é através de chamadas de métodos diretos. Por exemplo, a seguinte chamada define o fluxo de saída no modo hexadecimal para que números inteiros aparecem na tela como valores hexadecimais em vez de valores como decimais:

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

Aqui o setf () método define os sinalizadores de formato pelo primeiro mascarando fora os bits no segundo argumento e, em seguida, definindo os bits indicados pelo primeiro argumento. A função retorna o valor antigo para que a função de chamada pode restaurar as bandeiras de formato antes de retornar.

Na prática, essa função aparece da seguinte forma:

#incluir using namespace std - // displayHex - exibir um número em hexadecimal formatvoid displayHex (ostream& para fora, int n) {ios :: fmtflags prev = out.setf (ios :: hex, ios :: basefield) -out lt; lt; n-out.setf (ant) -} int main () {int n = 0x1234-cout lt; lt; "n = " lt; lt; n lt; lt; endl-cout lt; lt; "n é em hexadecimal "-displayHex (cout, n) -cout lt; lt; endl-retorno 0-}

O programa começa definindo a variável n para um valor hexadecimal. Em seguida, exibe o valor para cout. Em seguida, chama a displayHex () função para exibir o valor em formato hexadecimal. A saída do programa aparece da seguinte forma:

n = 4660n em hexadecimal é 1234

O valor em formato decimal não é reconhecível, mas a exibição hexadecimal é claramente o valor usado para inicializar n.

No entanto, C ++ fornece um segundo modo para controlar I / O formato: Os manipuladores de I / O.

O que é um / O manipulador I?

A I / O manipulador É um objecto que o programador pode ser inserida no fluxo de saída para invocar as funções de controlo de formato. O seguinte trecho de código demonstra o usuário de manipuladores de E / S. Ele executa a mesma função que o fragmento antes, excepto esta versão utiliza um manipulador de I / O para invocar o setf () função:

Video: Excel - Fluxo de caixa simples e formatação básica

#incluir #incluir usando espaço de nomes std-int main () {int n = 0x1234-cout lt; lt; "n = " lt; lt; n lt; lt; endllt; lt; "n é em hexadecimal " lt; lt; setbase (16) lt; lt; n lt; lt; endl-retorno 0-}

Aqui a Principal() primeiro saídas n como um valor decimal. Em seguida, ele usa o setbase (16) manipulador para alterar a base de exibição de decimal (base 10) para hexadecimal (base 16) antes de exibir o valor de novo. A saída a partir desta versão é indistinguível da versão anterior:

n = 4660n em hexadecimal é 1234

o setbase (16) objeto aparece apenas como uma chamada para uma função no meio do fluxo de saída. O fato de que um objeto está sendo criado é invisível para o usuário.

Video: Configurar bios do Not da HP e ASUS para formatar com pen drive ou DVD

Para hexadecimal, octal e decimal, C ++ fornece os atalhos feitiço, outubro e dezembro o que significa que o código poderia assumir a seguinte forma ainda mais curto:

cout lt; lt; "n = " lt; lt; n lt; lt; endllt; lt; "n é em hexadecimal " lt; lt; feitiço lt; lt; n lt; lt; endl-

O que I / manipuladores O que C ++ oferecer?

Ter um olhar para esta tabela, que contém uma lista de E / S manipuladores disponíveis para C ++ 2011.

Manipuladores O comum I /
I / O ManipuladorFunção
boolalpha noboolalphaAlterna entre textual e display numérico de um booleano. Quando
boolalpha é definido, o verdadeiro eo falso aparecem
na tela como verdade e falso. Quando não está definido, eles aparecem como 1 e ‘0’.
showbase noshowbaseQuando showbase é definido, os valores octal
são precedidos por um 0 e hexadecimal
Os valores são precedidos pela 0x ou 0X.
showpoint noshowpointUm ponto decimal é sempre exibido quando showpoint está definido.
showpos noshowposexibe uma + assinar na frente de
valores positivos quando showpos está definido.
Exibe nada quando noshowpos é
conjunto.
skipws noskipwsIgnora líder espaço em branco na entrada.
maiúscula nouppercaseE se maiúscula é definida, em seguida, usar
maiúsculas para formatos de saída, por exemplo, 0X para saída hexadecimal. E se nouppercase é definido, utilização minúsculas, por exemplo,
0x para saída hexadecimal.
unitbuf nounitbufSe estiver definido, então a saída não é tamponada mas lavada após cada
inserir. Se não for definido, a saída é tamponada.
fixo científicoDefinir a saída de valores de ponto flutuante, quer fixo ou
notação científica.
wsEste objeto come espaço em branco a partir de um fluxo de entrada.
extremidadesInsere um caractere nulo () Em uma produção
corrente. Útil para nulo de terminação uma corda ao usar ostrstream.
ruborEsvazia os caracteres do buffer para o fluxo de saída.
endlInsere um caractere de nova linha.
setiosflags(N)
resetiosflags(N)
Definir ou limpar o ios bandeiras en
masse.
setbase (n)Define a base para a entrada e saída de número inteiro de 8, 10, 16 ou 0.
Veja o texto para explicação de 0.
dezembro outubro feitiçoDefinir a base para decimal, octal ou hexadecimal.
abreviada para setbase (10), setbase (8), e setbase (16), respectivamente.
setfill (c)Define o caractere usado para preencher o espaço quando o número de
caracteres para mostrar é menor do que a largura do campo. O padrão
personagem é um espaço.
setprecision (n)Define o número de dígitos para a saída ao exibir um
número de ponto flutuante.
setw (n)Define a largura mínima do campo de saída seguinte. O campo é
expandida com setfill () personagens como
necessário.
setfill (c)Define o caractere usado para preencher o espaço quando o número de
caracteres para mostrar é menor do que a largura do campo. O padrão
personagem é um espaço.
interno esquerda certoDefinir a colocação de caracteres de preenchimento. Se o caractere de preenchimento
foram ‘*’ (por exemplo), em seguida:
interno
$ 123.00 **esquerda ** $ 123,00certo $ 123,00 **
get_money () put_money ()Ler ou exibir um valor monetário, usando as regras locais definidos
por localidade. (Isto não é implementado na versão atual do
GCC.)
consiga tempo() put_time ()Leia ou exibir uma hora ou data, usando as regras locais como definido pelo
localidade. (Isto não é implementado na versão atual do
GCC.)


A maioria dos manipuladores são simples. Alguns requerem alguma explicação, no entanto. Por exemplo, em relação ao setbase () manipulador, nem todos os valores de base são apoiadas. Na verdade, C ++ suporta apenas decimal, octal e hexadecimal I / O - que é ok, como isso é muito bonito tudo que é necessário. Você pode, no entanto, definir a base para 0 - na verdade, 0 é o valor padrão.

Definir a base para 0 é o mesmo que defini-lo para decimal para a saída. Para entrada, no entanto, definir a base para 0 significa “extrair a base do próprio número”. As regras para fazê-lo são os seguintes:

  • * Se um número começa com 0x ou 0X, presume-se ser hexadecimal.

  • * Se um número começa com apenas 0, então presume-se ser octal.

  • * Caso contrário, o número é assumido como sendo decimal.

O seguinte programa simples demonstra as seguintes regras:

#incluir #incluir usando espaço de nomes std-int main () {int n1, n2, n3-cin gt; gt; setbase (0) gt; gt; n1 gt; gt; n2 gt; gt; n3-cout 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-retorno 0-}

A primeira linha define a base para a cin opor-se a 0 e, em seguida, extrai três números inteiros. A segunda linha mostra estes três inteiros em formato hexadecimal. o showbase manipulador faz com que o líder 0x para ser exibida para valores hexadecimais. O seguinte mostra um exemplo de execução deste programa, onde os três números em negrito são os valores que a entrada do teclado:

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

Você pode ver que o primeiro número foi interpretado como 10 em base 10, que é 0xA em hexadecimal. O segundo número foi interpretado como 10 na base 8, o qual é 8 em hexadecimal. O terceiro e último número foi interpretado como 10 em hexadecimal.

Outro manipulador que merece menção especial é o setw (), abreviação de “width set”. Isso define a largura mínima de exibição do próximo campo exibido. O seguinte programa simples mostra como setw ()interage com estofamento e o caractere de preenchimento:

#incluir #incluir usando espaço de nomes std-int main () {int largura-int valor-cout lt; lt; "Introduza a largura:"CIN II-III gt; gt; largura-cout lt; lt; setfill ( `*`) - para (-) {cout lt; lt; "Insira um valor:"CIN II-III gt; gt; value-if (valor == 0) {break} cout lt; lt; "Esquerda, Direita e interno: n"lt; lt; esquerda lt; lt; setw (largura) lt; lt; valor lt; lt; ", "lt; lt; rightlt; lt; setw (largura) lt; lt; valor lt; lt; ", "lt; lt; interno lt; lt; setw (largura) lt; lt; valor lt; lt; endl-} return 0-}

Este programa define o caractere de preenchimento para * (O padrão é o espaço). Em seguida, ele lê a largura para ser usado para todos os números do teclado antes de entrar em um loop que lê e exibe valores. Dentro deste loop, o programa exibe primeiro o número com o esquerdo; preenchimento mão, depois com certa; preenchimento lado, e, finalmente, com preenchimento interno.

Video: Pra que Formatar o Pc? Conheça Técnicas Que Resolvem o Problema

O seguinte é um exemplo de execução do programa com a entrada em negrito:

Introduza a largura:5Insira um valor:100000Esquerda, Direita e interno: 100000, 100000, 100000Enter um valor:100Esquerda, Direita e interna: 100 ** ** 100, ** 100Enter um valor:-100Esquerda, Direita e interno: -100 *, * -100, - * 100Enter um valor:0

Aqui 5 é inserido como a largura do campo. No entanto, o primeiro valor inserido, 100.000, requer mais do que 5 colunas para exibir de modo nenhum dos campos de exibição teve qualquer efeito. A largura aparelho só define a largura mínima para exibir.

O próximo valor inserido, 100, requer apenas três colunas para exibir, para que o programa exibido o valor primeiro com dois * caracteres à direita, em seguida, à esquerda, e novamente à esquerda.

O próximo valor inserido, -100, demonstra a diferença entre encher direita e preenchimento interno. preenchimento direito colocar o caractere de preenchimento à esquerda do valor, incluindo o sinal de menos. preenchimento Interno colocar o caractere de preenchimento entre o valor eo sinal de menos. Isso também funciona para um sinal de mais, quando mais é forçado com o showpos manipulador e entre o número e o sinal monetário (quando a moeda é suportado pelo compilador).

Os manipuladores não adicionar qualquer capacidade que já não está presente. Afinal, cada um desses manipuladores acaba chamando um método público sobre o objeto de fluxo. No entanto, eles não fornecem um meio conveniente de formatação de I / O.


Publicações relacionadas