Você está na página 1de 7

Entrada/Sada com Streams C++

Objeto cout

O objeto cout representa o stream de sada no C++. Este stream uma
espcie de seqncia (fluxo) de dados a serem impressos na tela. Para realizar
a impresso, usa-se o "operador de insero" que "insere" dados dentro do
stream.
Operador de Insero (<<)

O operador << sobrecarregado (porque aceita todos os tipos de dados)
executa a sada (imprime na tela) com streams em C++. O objeto cout usado
em conjunto com ele para a impresso de dados.
#include <iostream>
using namespace std;
int main()
{
cout << "Imprimindo o famoso HELLO WORLD!!!\n";

// imprimindo uma linha usando mltiplos comandos
cout << "Teste com ";
cout << "dois couts\n";

// usando o manipulador endl
// endl gera um caractere nova linha, e tambm descarrega o
buffer de sada
cout << "Escrevendo uma linha..." << endl;

cout << "Mais uma vez...\n";
cout << flush; // agora apenas esvaziando o buffer de
sada, sem gerar nova linha

return 0;
}
O operador << sempre retorna uma referncia ao objeto cout. Desta
forma, possvel encadear vrios operadores <<, permitindo uma combinao
de constantes e variveis, como mostra o exemplo abaixo:
int a = 10;
int b = 12;
// imprime uma string e o resultado da soma entre as variveis a
e b
cout << "Encadeando sadas: Somandos dois nmeros " << a + b <<
endl;
A sada de caracteres tambm pode ser feita sem o uso do operador de
insero <<. Para isto, usa-se a funo membro put, que retorna uma
referncia para o objeto cout. Exemplos:
cout.put('caractere'); // fazendo a sada de um nico caractere
cout.put('caractere').put('\n'); // fazendo a sada encadeada

Objeto cin

O objeto cin representa o stream de entrada no C++. Ele realiza a leitura
de um sequncia de dados, sem espaos e sem tabulaes, vindas do teclado.
Para coletar estes dados armazenados, usa-se o "operador de extrao" que
"extrai" dados do stream.
Operador de Extrao (>>)

O operador >> sobrecarregado (porque aceita todos os tipos de dados)
executa a entrada com streams em C++, usando o comando cin para aquisio
de dados. Variveis podem ser usadas para o armazenamento das
informaes.
#include <iostream>

using namespace std;
int main()
{
int Num1;
int Num2;
cout << "Lendo o primeiro nmero...: ";
cin >> Num1;
cout << endl;
cout << "Lendo o segundo nmero....: ";
cin >> Num2;
cout << endl;

return 0;
}
Da mesma forma que o operador de insero, o operador de extrao
>> sempre retorna uma referncia ao objeto cin, permitindo o encadeamento
de vrios cin. Exemplo:
float c;
float d;
cin >> c >> d; // entra com um float, pressiona <ENTER>,
entra com outro float, pressiona <ENTER>
Outras peculiaridades usando o operador de extrao:
while(cin >> dado)// repete enquanto o usurio no digitar fim
de arquivo (Ctrl+Z ou Ctrl+D)
cin.eof(); // devolve 1 (verdadeiro) se chegou ao fim do arquivo

char c;
c = cin.get();
cin.get(vet, n, '\n');
char nome[100];
cin >> nome; // l at o 1 espao em branco apenas
cin.get(nome, 100); // l at o 99 caractere ou <ENTER>
cin.get(nome, 100, 'x');
/* get sempre insere um NULL no final da seqncia lida.
O delimitador no retirado da entrada. Isto faz com que a
prxima leitura devolva este caractere (no caso, uma linha ser
devolvida. */

cin.getline(nome, TAM); // remove o delimitador do buffer
automaticamente

cin.putback(); // recoloca o ltimo caractere lido de volta no
buffer

E/S segura quanto ao tipo

Quando dados inesperados so processados pelos operadores << e >>,
vrios indicadores de erros podem ser ativados para indicar se houve sucesso
ou falha em uma operao de E/S.
O exemplo abaixo apresenta alguns deles:
int dado;
cin.eof(); // retorna verdadeiro se o fim do arquivo foi
encontrado
cin >> dado; // l um inteiro
if(cin.bad()) { // houve uma falha na leitura
// ...
}
if(cin.fail()) { // dado digitado incompatvel com o dado
esperado (formatao)
// ...
}
if(cin.fail()) { // estado da stream est OK
// ...
}

ou usando

ios::eofbit
ios::badbit
ios::failbit
ios::goodbit
cin.clear(); // reseta o estado de stream, ativando "goodbit"

Manipuladores de streams

Executam tarefas de formatao, por meio de diferentes recursos. Alguns deles
esto abaixo destacados:
Base do stream de inteiros
#include <iomanip>
#include <iostream>
using namespace std;
// ...
cin >> n;
cout << hex << n << endl // apresenta n em hexadecimal
<< oct << n << endl // apresenta n em octadecimal
<< setbase(10) << n << endl; // apresenta n na base 10
// ...
Preciso em ponto flutuante:
double PI = 3.14159265;
cout.precision(5); // define a preciso
cout << setiosflags (ios::fixed) << f << endl;
cout << PI; // imprime PI com 5 casas decimais
Ou
cout << setiosflags (ios::fixed) << setprecision(5) << PI;
// define e imprime PI com 5 casas decimais

Para retornar ao formato de impresso padro:
cout << setiosflags (ios::scientific);
cout << f << endl;
Largura de campo:

Para definir a largura da impresso de uma varivel usa-se o setw(n),
onde n o nmero de caracteres desejado para a impresso desta
varivel.
Note que o setw s afeta a prxima variveldo cout.
int caixas = 45;
cout << "Nmero de caixas: " << setw(10) << caixas << endl;
Alinhamento da impresso

possvel alinhar os dados impressos tanto esquerda quanto
direita, com os manipuladores left e right.
cout << right << 10;
cout << left << 10;

Entrada de Strings

Em determinadas ocasies, deseja-se coletar dados que contenham
strings com tabulaes, espaos em branco e/ou novas linhas. Frases so
exemplos onde este tipo de situao ocorre. No entanto, o operador >>
sobrecarregado ignora tais caracteres.
Para englobar essas situaes, C++ oferece o uso da funo-membro
getline. Esta funo remove o delimitador do stream (isto , l o caractere e o
descarta) e armazena o mesmo em uma varivel definida pelo usurio.
Abaixo, um exemplo de sua utilizao.
#include <iostream>
using namespace std;
int main()
{
const TAM = 80;
char guarda[TAM];
cout << "Digite uma frase com espaos: " << endl;
cin.getline(guarda, TAM);
cout << "A frase digitada : \n" << guarda << endl;
return 0;
}
Exemplos:
//*********************************
// cin.cpp
//
// Entrada de string com CIN
//
//*********************************

#include <iostream>
#include <stdlib.h>


using namespace std;
using std::cout;
using std::endl;


int main(int argc, char *argv[])
{
string s1, s2;

int i,j;
cout << "Ola'!" << endl;
cin >> s1;
cout << "String lida 1:" << s1 << "*" << endl;
cin >> s2;
cout << "String lida 2:" << s2 << "*" << endl;

getline(cin, s1); // pega o enter que ficou no buffer
getline(cin, s1); // permite a leitura de uma string com espaos em
branco

cout << "String lida 3:" << s1 << "*" << endl;
system("PAUSE");
return 0;
}

/*
Ola'!
um teste
String lida 1:um*
String lida 2:teste*
outro teste
String lida 3:outro teste*
Press any key to continue . . .
*/

Exemplo:
//*********************************
// getline.cpp
//
// Entrada de string com getline
//
//*********************************

#include <iostream>
#include <stdlib.h>


using namespace std;
using std::cout;
using std::endl;


int main(int argc, char *argv[])
{
string s1, s2;

int i,j;
cout << "Ola'!" << endl;
getline(cin, s1);
cout << "String lida 1:" << s1 << "*" << endl;
getline(cin, s2);
cout << "String lida 2:" << s2 << "*" << endl;

getline(cin, s1, '&'); // para a leitura no '&'
// note que o caracter '&' NO vai para 's1'
cout << "String lida 1:" << s1 << "*" << endl;

system("PAUSE");
return 0;
}

/*
Ola'!
um teste
String lida 1:um teste*
outro teste
String lida 2:outro teste*
mais um & teste
String lida 1:mais um *
Press any key to continue . . .



*/

Você também pode gostar