Tutorial C ++: Aprenda sobre entrada e saída

01

de 08

Uma nova maneira de produzir

Código do programa
analista de tráfego / Getty Images

O C ++ mantém uma compatibilidade reversa muito alta com o C, então pode ser incluído para dar acesso ao printf () função para saída. No entanto, a E / S fornecida pelo C ++ é significativamente mais poderosa e, mais importante, do tipo seguro. Você ainda pode usar scanf () para entrada, mas os recursos de segurança de tipo fornecidos pelo C ++ significam que seus aplicativos serão mais robustos se você usar o C ++.

Na lição anterior, isso foi abordado com um exemplo que usava cout. Aqui vamos aprofundar um pouco mais a começar pela saída, pois ela tende a ser mais usada que a entrada.

A classe iostream fornece acesso aos objetos e métodos necessários para saída e entrada. Pense na E / S em termos de fluxos de bytes - indo do seu aplicativo para um arquivo, a tela ou uma impressora - a saída ou o teclado - a entrada.

Saída com Cout

Se você conhece C, talvez saiba que << é usado para mudar os bits para a esquerda. Por exemplo, 3 << 3 é 24. Por exemplo, o deslocamento à esquerda dobra o valor, de modo que 3 turnos à esquerda o multiplicam por 8.

instagram viewer

Em C ++, << foi sobrecarregado na classe ostream para que int, flutuadore tipos de strings (e suas variantes, por exemplo dobra) são todos suportados. É assim que você faz a saída de texto, reunindo vários itens entre <<.>


cout << "Some Text" << intvalor << floatdouble << endl; 

Essa sintaxe peculiar é possível porque cada um dos << é na verdade uma chamada de função que retorna um referência para um ostream objeto. Então, uma linha como a acima é realmente assim


cout. << ("algum texto"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

O C funçãoprintf conseguiu formatar a saída usando os especificadores de formato, como% d. No C ++, o cout também pode formatar a saída, mas usa uma maneira diferente de fazer isso.

02

de 08

Usando o Cout para formatar a saída

O objeto cout é um membro do iostream biblioteca. Lembre-se de que isso deve ser incluído em um


#incluir 

Esta biblioteca iostream é derivado de ostream (para saída) e istream para entrada.

Formatação da saída de texto é feita inserindo manipuladores no fluxo de saída.

O que é um manipulador?

É uma função que pode alterar as características do fluxo de saída (e entrada). Na página anterior vimos que << foi uma função sobrecarregada que retornou uma referência ao objeto de chamada, por exemplo. cout para saída ou cin para entrada. Todos os manipuladores fazem isso para que você possa incluí-los na saída << ou entrada >>. Vamos olhar para entrada e >> mais adiante nesta lição.


count << endl; 

endl é um manipulador que termina a linha (e inicia um novo). É uma função que também pode ser chamada dessa maneira.


endl (cout); 

Embora na prática você não faça isso. Você usa assim.


cout << "Algum texto" << endl << endl; // Duas linhas em branco. 

Arquivos são apenas fluxos

Algo a ter em mente que, com muito desenvolvimento nos dias de hoje, é feito em GUI aplicativos, por que você precisaria de funções de E / S de texto? Isso não é apenas para console formulários? Bem, você provavelmente fará E / S de arquivos e poderá usá-los também, mas também o que é exibido na tela também precisa ser formatado. Os fluxos são uma maneira muito flexível de lidar com entrada e saída e podem trabalhar com

  • E / S de texto. Como nos aplicativos de console.
  • Cordas. Útil para formatação.
  • Arquivo E / S.

Manipuladores Novamente

Embora tenhamos usado o ostream classe, é uma classe derivada de ios classe que deriva da ios_base. Essa classe ancestral define o público funções que são manipuladores.

03

de 08

Lista de Manipuladores de Cout

Os manipuladores podem ser definidos nos fluxos de entrada ou saída. Esses são objetos que retornam uma referência ao objeto e são colocados entre pares de <<. A maioria dos manipuladores é declarada em, mas endl, termina e rubor vem de onde . Vários manipuladores usam um parâmetro e estes vêm de .

Aqui está uma lista mais detalhada.

A partir de

  • endl - Termina a linha e chama flush.
  • termina - Insere '\ 0' ( NULO) no fluxo.
  • descarga - força a saída do buffer imediatamente.

A partir de . A maioria é declarada em o ancestral de . Eu os agrupei por função e não por ordem alfabética.

  • boolalpha - insere ou extrai objetos bool como "true" ou "false".
  • noboolalpha - insere ou extrai objetos bool como valores numéricos.
  • fixo - Insere valores de ponto flutuante em formato fixo.
  • científico - Insira valores de ponto flutuante no formato científico.
  • interno - justificado interno.
  • esquerda - justificar à esquerda.
  • right - Justifique à direita.
  • dec - Insere ou extrai valores inteiros no formato decimal.
  • hex - Insira ou extraia valores inteiros no formato hexadecimal (base 16).
  • oct - Insira ou extraia valores no formato octal (base 8).
  • noshowbase - Não prefixe o valor com sua base.
  • showbase - Valor do prefixo com sua base.
  • noshowpoint - Não mostre o ponto decimal se não for necessário.
  • showpoint - sempre mostra ponto decimal ao inserir valores de ponto flutuante.
  • noshowpos - Não insira o sinal de mais (+) se o número> = 0.
  • showpos - Insira o sinal de mais (+) se o número> = 0.
  • noskipws - Não pule o espaço em branco inicial ao extrair.
  • skipws - Ignora o espaço em branco inicial na extração.
  • nouppercase - Não substitua letras minúsculas por equivalentes maiúsculas.
  • maiúsculas - Substitua as letras minúsculas pelos equivalentes em maiúsculas.
  • unitbuf - Limpe o buffer após uma inserção.
  • nounitbuf - Não libere o buffer após cada inserção.

04

de 08

Exemplos usando Cout

// ex2_2cpp. #include "stdafx.h" #incluirusando espaço para nome std; int main (int argc, char * argv []) { cout.width (10); cout << direita << "Teste" << endl; cout << left << "Teste 2" << endl; cout << interno << "Teste 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << maiúsculo << "David" << endl; cout.precision (8); cout << científico << endl; cout << 450678762345.123 << endl; cout << fixo << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: maiúsculas); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; retornar 0; }

A saída disso está abaixo, com um ou dois espaços de linha extras removidos para maior clareza.

 Teste. Teste 2. Teste 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Nota: Apesar das letras maiúsculas, David é impresso como David e não como DAVID. Isso ocorre porque as letras maiúsculas afetam apenas a saída gerada; por exemplo, números impressos em hexadecimal. Portanto, a saída hexadecimal 4d2 é 4D2 quando maiúscula está em operação.

Além disso, a maioria desses manipuladores realmente define um pouco em um sinalizador e é possível configurá-lo diretamente com

 cout.setf () 

e limpe com

 cout.unsetf () 

05

de 08

Usando Setf e Unsetf para manipular a formatação de E / S

A função setf tem dois sobrecarregado versões mostradas abaixo. Enquanto unsetf apenas limpa os bits especificados.

 setf (valores da bandeira); setf (valores de bandeira, valores de máscara); unsetf (valores de flag); 

Os sinalizadores de variável são derivados por Anel-O juntos todos os bits que você deseja | Então se você quiser científico, maiúsculo e boolalpha então use isso. Somente os bits passaram como o parâmetro estão prontos. Os outros bits permanecem inalterados.

 cout.setf (ios_base:: científico | ios_base:: maiúsculo | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; valor bool = true; cout << valor << endl; cout.unsetf (ios_base:: boolalpha); cout << valor << endl; 

Produz

 4D2. 1.234000E + 011. verdade. 1. 

Bocados de máscara

Os dois parâmetro A versão do setf usa uma máscara. Se o bit estiver definido no primeiro e no segundo parâmetros, ele será definido. Se o bit estiver apenas no segundo parâmetro, ele será limpo. Os valores Adjustfield, basefield e floatfield (listados abaixo) são sinalizadores compostos, ou seja, vários sinalizadores Or'd juntos. Para campo de base com os valores 0x0e00 é o mesmo que dez | outubro | hex. então

 setf (ios_base:: hex, ios_basefield); 

limpa todas as três bandeiras e depois define hex. similarmente Adjustfield é esquerda | direito | interno e floatfield é científico | fixo.

Lista de bits

Esta lista de enumerações é retirada do Microsoft Visual C ++ 6.0. Os valores reais usados ​​são arbitrários - outro compilador pode usar valores diferentes.

 skipws = 0x0001. unitbuf = 0x0002. maiúsculas = 0x0004. showbase = 0x0008. ponto de exposição = 0x0010. showpos = 0x0020. esquerda = 0x0040. right = 0x0080. interno = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. científico = 0x1000. fixo = 0x2000. boolalpha = 0x4000. Adjustfield = 0x01c0. campo base = 0x0e00, campo flutuante = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

de 08

Sobre Clog and Cerr

Gostar cout, entupir e cerr são objetos predefinidos definidos no ostream. A classe iostream herda de ambos ostream e istream é por isso que o cout exemplos podem usar iostream.

Buffer e não Bufered

  • Buffer - Todas as saídas são armazenadas temporariamente em um amortecedor e depois jogado na tela de uma só vez. Cout e tamanco são armazenados em buffer.
  • Sem buffer - Todas as saídas vão imediatamente para o dispositivo de saída. Um exemplo de um objeto sem buffer é cerr.

O exemplo abaixo demonstra que o cerr é usado da mesma maneira que o cout.


#incluir usando espaço para nome std; int _tmain (int argc, _TCHAR * argv []) {largura do cerr (15); certo; cerr << "Erro" << endl; retornar 0; }

O principal problema com o buffer é se o programa falha, o conteúdo do buffer é perdido e é mais difícil entender por que ele falhou. A saída sem buffer é imediata, portanto, espalhar algumas linhas como essa pelo código pode ser útil.

 cerr << "Entrada da função perigosa zappit" << endl; 

O problema do registro

Criar um log de eventos do programa pode ser uma maneira útil de detectar erros difíceis - o tipo que ocorre apenas de vez em quando. Se esse evento for um travamento, você terá o problema - você libera o log para o disco após cada chamada para poder ver os eventos até o acidente ou mantenha-o em um buffer e limpe-o periodicamente e espero que você não perca muito quando o acidente ocorre?

07

de 08

Usando Cin para entrada: entrada formatada

Existem dois tipos de entrada.

  • Formatado. Leitura de entrada como números ou de um determinado tipo.
  • Não formatado. Lendo bytes ou cordas. Isso proporciona um controle muito maior sobre o fluxo de entrada.

Aqui está um exemplo simples de entrada formatada.

 // excin_1.cpp: define o ponto de entrada para o aplicativo do console. #include "stdafx.h" // Somente Microsoft. #incluir usando espaço para nome std; int main (int argc, char * argv []) { int a = 0; flutuador b = 0,0; int c = 0; cout << "Digite um int, um float e um int separados por espaços" <> a >> b >> c; cout << "Você digitou" << a << "" << b << "" << c << endl; retornar 0; }

Isso usa cin para ler três números (int, flutuador, int) separados por espaços. Você deve pressionar enter após digitar o número.

3 7.2 3 exibirá "Você digitou 3 7.2 3".

A entrada formatada tem limitações!

Se você digitar 3,76 5 8, obterá "Você digitou 3 0,76 5", todos os outros valores nessa linha serão perdidos. Isso está se comportando corretamente, como o. não faz parte do int e, portanto, marca o início do float.

Interceptação de erro

O objeto cin define um bit de falha se a entrada não foi convertida com êxito. Este bit faz parte de ios e pode ser lido usando o falhou() função em ambos cin e cout como isso.

 if (cin.fail ()) // faz alguma coisa. 

Não é de surpreender, cout.fail () raramente é definido, pelo menos na saída da tela. Em uma lição posterior sobre E / S de arquivo, veremos como cout.fail () pode se tornar realidade. Há também um Boa() função para cin, cout etc.