next up previous contents
Next: Definição de variáveis Up: Particularidades de C++ Previous: Operador de escopo   Sumário

Entrada e Saída

C ++, assim como C, não oferece operações de entrada e saída como parte da linguagem em si. Ao invés disto, ela oferece uma biblioteca que adiciona as funções de entrada e saída de forma elegante, usando o conceito de streams.

O próximo exemplo mostra, ainda que de forma muito simples, o uso dos métodos de entrada e saída. Algumas variáveis são definidas e enviadas para o dispositivo de saída padrão (o monitor) através do stream cout. Observe como, ao contrário do que acontece com printf em C, o programador não tem de dizer ao sistema que tipo de dado está sendo enviado para a saída.

indentation

#include $<$iostream.h$>$
#include $<$string.h$>$

main()
{
int index;
float distance;
char letter;
char name[25];

index = -23;
distance = 12.345;
letter = 'X';
strcpy(name,"John Doe");

cout $\ll$ "The value of index is " $\ll$ index $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The value of distance is " $\ll$ distance $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The value of letter is " $\ll$ letter $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The value of name is " $\ll$ name $\ll$ begintex2html_wrap_inline$$n";

index = 31;
cout $\ll$ "The decimal value of index is " $\ll$ dec $\ll$ index $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The octal value of index is " $\ll$ oct $\ll$ index $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The hex value of index is " $\ll$ hex $\ll$ index $\ll$ begintex2html_wrap_inline$$n";
cout $\ll$ "The character letter is " $\ll$ (char)letter $\ll$ begintex2html_wrap_inline$$n";

cout $\ll$ "Input a decimal value -$>$ ";
cin $\gg$ index;
cout $\ll$ "The hex value of the input is " $\ll$ index $\ll$ begintex2html_wrap_inline$$n";
}
O resultado da execução deste programa seria:
     The value of index is -23
     The value of distance is 12.345
     The value of letter is X
     The value of name is John Doe
     The decimal value of index is   31
     The octal value of index is   37
     The hex value of index is   1f
     The character letter is X
     Input a decimal value --> 999
     The hex value of the input is 3e7

O operador <<, chamado de operador de inserção, diz para o sistema para enviar a seguinte variável ou constante para a saída, mas deixa o sistema decidir como apresentar o dado. Observe a consistência que este operador apresenta: em uma mesma linha de código, ele é utilizado para apresentar um string de caracteres e números (inteiros, ponto flutuante), sem que o programador tenha que se preocupar qual a rotina que será chamada para a apresentação. O sistema é encarregado de decidir qual a rotina apropriada. Este comportamento já sugere algumas das vantagens da orientação a objetos, como observado no Capítulo [*].

A grande vantagem da biblioteca de streams de C ++ é que ela suporta boa parte das necessidades de entrada e saída de forma simples e eficiente. Os compiladores C ++ podem também oferecer algumas facilidades adicionais de formatação para esta biblioteca, mas em último caso a rotina tradicional printf pode continuar sendo usada juntamente com cout sempre que necessário. Entretanto, deve-se lembrar que printf não é uma rotina muito eficiente, pois ela deve estar preparada para resolver todos os casos possíveis de formatação de saída -- ou seja, é uma rotina complexa. Algumas das facilidades de formatação são apresentadas no exemplo acima: o mesmo dado é apresentado em formatos decimal, octal e hexadecimal.

Além do stream cout, há também o stream cin que é usado para ler dados do dispositivo de entrada padrão. Neste caso, o operador >>, chamado de operador de extração, é utilizado. Como no uso de cout, os operadores dec, oct e hex podem selecionar a base de numeração adotada para a entrada; como usual, a base decimal é o padrão quando nada é especificado.

Há também um stream cerr pré-definido, que envia dados para o dispositivo de erros padrão. Estes três streams, cout, cin e cerr correspondem aos apontadores para stream stdout, stdin e stderr da linguagem C, e são automaticamente abertos e fechados pelo sistema.

Os mesmos mecanismos de manipulação de streams podem ser utilizados para manipular arquivos do usuário. O próximo exemplo ilustra as capacidades de manipulação de arquivos através da biblioteca de streams de C ++.

indentation

#include $<$iostream.h$>$
#include $<$fstream.h$>$
#include $<$process.h$>$

void main()
{
ifstream infile;
ofstream outfile;
ofstream printer;
char filename[20];

cout $\ll$ "Enter the desired file to copy --$>$ ";

cin $\gg$ filename;

infile.open(filename, ios::nocreate);
if (!infile) {
cout $\ll$ "Input file cannot be opened.$\backslash$n";
exit(1);
}

outfile.open("copy");
if (!outfile) {
cout $\ll$ "Output file cannot be opened.$\backslash$n";
exit(1);
}

printer.open("PRN");
if (!printer) {
cout $\ll$ "There is a problem with the printer.$\backslash$n";
exit(1);
}

cout $\ll$ "All three files have been opened.$\backslash$n";

char one_char;

printer $\ll$ "This is the beginning of the printed copy.$\backslash$n$\backslash$n";

while (infile.get(one_char)) {
outfile.put(one_char);
printer.put(one_char);
}

printer $\ll$ begintex2html_wrap_inline$$n$\backslash$nThis is the end of the printed copy.$\backslash$n";

infile.close();
outfile.close();
printer.close();

}
Neste exemplo, um arquivo é aberto para leitura, outro para escrita, e um terceiro é aberto para a impressora. A diferença entre estes arquivos e aqueles do exemplo anterior é que aqueles já estavam abertos pelo sistema, enquanto que estes têm de ser explicitamente abertos e fechados. (Apesar de um arquivo ser fechado automaticamente ao fim da execução de um programa que o abriu, fechar os arquivos que foram abertos é sempre uma boa prática de programação.)

Como resultado da execução deste programa (caso o arquivo de entrada exista e não haja problemas com a impressora), o arquivo de entrada seria copiado para um outro arquivo com nome copy e seria também impresso através da impressora.


next up previous contents
Next: Definição de variáveis Up: Particularidades de C++ Previous: Operador de escopo   Sumário
Ivan Luiz Marques Ricarte 2001-06-01