13 Programação em C++
13.4 I/O em C++: Stream
A linguagem C++ permite a utilização dos mecanismos de I/O definidos em C, mas define novas bibliotecas, mais adequadas ao paradigma da Orientação a Objetos. Essas bibliotecas constituem a chamada biblioteca Stream do C++, sendo esta biblioteca toda definida em termos de classes de objetos. Nela estão os três objetos: cin, cout e cerr destinados à entrada e saída de dados via terminal ou via arquivos. As definições e declarações necessárias para o uso de “streams” estão contidas no arquivo <iostream.h>.
13.4.1 A stream de saída cout
Cout é um objeto de uma clase de I/O predefinida em C++. Para mostrar os dados em um programa C++, deve-se utilizar a stream cout. Por default cout está associada a uma saída padrão (stdout), i.e., o ao terminal de vídeo. Sintaxe de cout :
cout << expressão;
onde,
<< : é o operador de inserção usado a fim de direcionar a saída de dados para a saída padrão (vídeo).
expressão : é qualquer combinação de caracteres ou variável.
Abaixo apresentamos alguns exemplos da utilização de cout. Note que em nenhuma das declarações da stream cout são formatados os dados a serem apresentados. Essa formatação é feita pela própria stream.
Variáveis C++ Resultado int x = 2; Cout << “x = ” << x; x = 2 Float f = 1.2, g = 3; Cout << f << “ ” << g; 1.20 3.00 Double dou = 2.14; Char ch = ‘F’; Cout << “valor = ” << dou << “\nsex = ” << ch; valor = 2.14 sex = F
No último exemplo acima, mostramos o uso do caracter especial ‘\n’ para fazer com que o computador pule uma linha antes de continuar escrevendo dados na tela. Podemos utilizar todos os caracteres especiais definidos para printf() da mesma maneira que utilizamos agora ‘\n’. Uma lista completa destes caracteres está em 3.1.
O objeto cout utiliza flags de formatação para sinalizar as opções de formatação dos dados. Os flags (sinalizadores) de formato (definidos em <iomanip>) são os seguintes:
Manipulador Significado
skipws Ignora o espaço em branco na entrada
left Saída ajustada à esquerda
right Saída ajustada à direita
Curso de Linguagem Computacional C/C++
dec Conversão em decimal
oct Conversão em octal
hex Conversão em hexadecimal
showbase Mostra o indicador de base na saída
showpoint Mostra ponto decimal (para float)
uppercase Saída hexadecimal maiúscula
showpos Mostra o sinal ‘+’ em inteiros positivos
scientific usa notação científica de ponto flutuante 1.23E2
fixed usa notação de ponto flutuante 1.23
unitbuf Libera (flush) todas as streams depois da inserção
stdio Libera (flush) stdout, stderr depois de inserção A sintaxe para usar esses sinalizadores (ou flags) é a seguinte:
cout.setf(ios::<sinalizador>); // para ligar
cout.setf(ios::scientific);
cout << 12.345; // Imprimirá : 0.12345E2
cout.unsetf(ios::<sinalizador>); // para desligar
cout.unsetf(ios::scientific);
cout << 12.345 // Imprimirá: 12.345
O objeto cout permite estabelecer o tamanho de um campo para a impressão. Isto significa que podemos definir o número de colunas que serão ocupados por um valor ou texto a ser impresso. Geralmente, a definição de tamanho de campos é usada para alinhamento e estética de um relatório.
Os manipuladores de formato são utilizados para manipular a formatação dos dados em streams de saída. Alguns manipuladores são idênticos ao sinalizadores, a diferença está na forma mais compacta e na inclusão de outra biblioteca de classes <iomanip>.
Manipulador Significado
dec Passa ara base decimal
oct Passa ara base octal
hex Passa ara base hexadecimal
ws Extrai caracteres de espaço em branco
endl Insere nova linha e libera stream
ends Insere término nulo em string ‘\0’
flush Libera o buffer de saída ostream alocado
setbase(n) Ajusta o formato de conversão para a base n. default n = 0;
resetiosflags(long) Limpa os bits de formato em ins ou outs especificadas.
setiosflags(long) Ajusta os bits de fomato em ins ou outs especificadas. setfill(int n) Ajusta o caracter de preenchimento para n
setprecision(int n) Ajusta a precisão do ponto flutuante para n
setw(int n) Ajusta o tamanho do campo para n Exemplo do uso destes manipuladores:
// Exemplo do emprego de Cout #include <iostream>
#include <iomanip> using namespace std;
Curso de Linguagem Computacional C/C++ { float lap = 4.875; float bor = 234.5421234546; int can = 42; int cad = -8; cout << "\n\n" << setiosflags(ios::left); cout << setprecision(2);
cout << "\n\t" << "Lapis " << setw(12) << lap; cout << "\n\t" << "Borracha " << setw(12) << bor; cout << "\n\t" << "Canetas " << setw(12) << can; cout << "\n\t" << "Cadernos " << setw(12) << cad;
cout << "\n\t" << setfill('.') << "Fitas " << setw(12) << "TYE";
return 0; }
Observação: Todos esses cabeçalhos usados oferecem recursos no ambiente de nomes std, de modo que, para usar os nomes que eles oferecem, precisamos ou usar qualificação explícita com std: : ou trazer os nomes para o ambiente de nomes global com
using namespace std;
Observação: quando a função main( ) é chamada, esta recebe dois argumentos especificando o número de argumentos, usualmente chamado argc, e um array de argumentos, usualmente chamado de argv. Os argumentos são strings de caracteres, de modo que o tipo de argv é char* [argc+1]. O nome do programa é passado como argv[0], de modo que argc é sempre no mínimo 1. A lista de argumentos é terminada por um zero; isto é, argv[argc] = = 0.
Observação: Se o tamanho do campo especificado em setw for menor que o tamanho mínimo necessário para imprimir o valor associado, a impressão utilizará o número necessário de colunas, ignorando o tamanho do campo.
Outro exemplo do emprego destes manipuladores:
// Exemplo do emprego de hex, dec e oct #include <iostream>
int main(int argc, char* argv[])
{
int n = 15;
cout << "\n" << "Hexadecimal \t" << hex << n; cout << "\n" << "Decimal \t" << dec << n; cout << "\n" << "Octal \t" << oct << n; return 0;
}
13.4.2 A stream de entrada cin
A forma de entrar com dados em um programa C++ é através do objeto cin. Tratra-se de um fluxo associado à entrada padrão do computador (stdin, i.e, o teclado). A sintaxe de cin é:
cin >> variável;
Curso de Linguagem Computacional C/C++
>> : é o operador de extração usado para direcionar a entrada de dados à entrada padrão (teclado). Através do contexto, o compilador sabe que este operador não será o operador para deslocamento de bits mas sim o operador de leitura de dados.
variável : é o nome da variável onde desejamos guardar os valores lidos.
Na tabela a seguir, apresentamos alguns exemplos da leitura de dados através de cin. Note que em C++ não é necessário formatar o dado que está sendo lido. Cin faz isto automaticamente, de acordo com a declaração da variável.
Variáveis C++ C
int x; cin >> x; scanf(“%d”,&x);
float f,g; cin >> f >> g; scanf(“%f %f”, &f, &g); double dou; char ch; cin >> dou >> ch; scanf(“%Lf %c”, &dou, &ch);
O objeto cin faz com que o programa aguarde que você digite o dado a ser adquirido e pressione a tecla [ENTER] para finalizar a entrada. O operador >> pode apresentar-se diversas vezes numa instrução com a finalidade de permitir a introdução de diversos valores ao mesmo tempo. Múltiplas entradas são digitadas separadas por um espaço em branco. O objeto cin entende um espaço em branco como término de uma entrada e o [ENTER] como finalizador geral.
Podemos ler números em outras bases numéricas, utilizando os manipuladores hex, dec e oct apresentados anteriormente.
int n = 0;
cin >> hex >> n;
A biblioteca stream define outras funções para leitura e escrita de dados que não serão aqui apresentadas. Todas as funções apresentadas na secção 3 podem ser aqui empregadas.