Manipula
Manipula
ç
ç
ão de
ão de
Streams
Streams
e arquivos
e arquivos
Prof. Leandro Tonietto
Estruturas de Dados em C++ - Unisinos ltonietto@unisinos.br
http://www.inf.unisinos.br/~ltonietto mar-09
Introdução
Streams:
Área de memória intermediária entre
software e hardware.
Levam os bytes de dados para dispositivos. E
dos dispositivos até o programa. Exemplos:
•
cout
é uma stream associada com o dispositivo
padrão de saída (monitor), então qualquer byte
enviado para
cout
será exibido na tela.
•
cin
esta associada ao dispositivo de entrada
padrão (teclado). Recebe bytes digitados no
teclado para o programa em execução.
Introdução
Streams: Fluxo de bits
0010010110010100101111001
> teste cout << “Teste”; cout << “Teste”; Software Stream de escrita / saída Dispositivo de saída0010010110010100101111001
cin >> dado; cin >> dado; Software Stream de leitura / entrada Dispositivo de entradaIntrodução
Existem streams associadas com qualquer
dispositivo do computador.
Programação com streams em C++
Streams padrão em C++.
Objetos:
• cin, cout, cerr e clog
É necessário fazer:
#include <iostream>Não esquecer:
// geral using namespace std; // ou individual using std::cout; using std::cin;Programação com streams em C++
Exemplo:
#include <iostream>
using std::cout;
int main(){
cout << “Hello world!!”;
return 0;
}
Programação com streams em C++
Exemplo:
#include <iostream>
using std::cin;
int main(){
int valor;
cin >> valor;
return 0;
}
Programação com streams em C++
Métodos de leitura/escrita:
Alto nível:
• Manipulação de dados formatados (p.e. leitura direto para uma variável int: cin >> valor)
• Conversão automática de bytes para o formatação que está sendo lido; o mesmo se aplica para a escrita, conversão automática de dados de tipo qualquer para byte.
• Simples de serem usados, porém com problemas de desempenho.
Programação com streams em C++
Métodos de leitura/escrita:
Baixo nível:
• Manipulação de bytes. Os bytes precisam ser tratados ou convertidos para o formato que se está utilizando. (exemplo de leitura: cin.read(buffer, 80))
• Mais complexo de se utilizar, porém muito mais rápido. • Não recomendado para pequenas quantidades de dados ou
manipulação com cin / cout, que em geral implica em manipulação de poucos dados.
• Deve ser utilizado para leitura/escrita de grande
quantidade de dados, proveniente de dispositivos externos ou mais lentos ou para manipulação em plataformas móveis.
Programação com streams em C++
Métodos de leitura/escrita:
Dicas para decisão:
• Volume pequeno de dados no HD? Arquivos de
configuração, por exemplo.
– Alto nível
• São dados oriundos de uma conexão em rede?
– Baixo nível• Dispositivos com recursos limitados (celulares,
PDAs,...)?
– Baixo nível
• Ações de leitura de dados inseridos pelo teclado no
prompt e exibição de dados na tela?
Programação com streams em C++
Exemplo de
leitura/escrita
alto-nível
:
#include <iostream>
using std::cin;
using std::cout;
int main(){
int var;
cin >> var;
cout << “O usuário digitou ” << var;
return 0;
}
Programação com streams em C++
Alternativas de
leitura/escrita
alto-nível
:
#include <iostream>
using std::cin;
using std::cout;
int main(){
char var;
var = cin.get();
cout << “O usuário digitou ”;
cout.put(var);
cout.put(‘ ‘).put(‘.’);
return 0;
}
Programação com streams em C++
Lendo uma linha inteira de dados:
#include <iostream>
using std::cin;
int main(){
char buffer[80];
// lê até encontrar “\n” ou até 80 char
cin.getline(buffer, 80);
cout << “O usuário digitou ” << buffer;
return 0;
}
AtenAtencom com ççãoãogetlinegetline: quando ocorre a leitura de uma string : quando ocorre a leitura de uma string ()() apapóós a leitura de s a leitura de dede dados dados numnumééricos devericos deve--se fazer se fazer cin.get(cin.get()) para para limpar o buffer antes de ler a string.
Programação com streams em C++
Pode ser usado tanto para streams de entrada e saída
Conforme ocorrem erros, alguns bits são marcados
Abaixo estão listados os bits, métodos e a condição
para o retorno verdadeiro
eofbit – cin.eof() - Se o fim do arquivo foi encontado
failbit – cin.fail() - Erro de formato sem perda de dados badbit – cin.bad() - Erro com perda de dados. Erros mais
sérios
goodbit – cin.good() - Se nenhum dos bits anteriores estão assinalados
cin.clear() - Limpa os estados dos bits e deixa a stream como good.
Programação com streams em C++
Leitura baixo-nível:
Deve-se acessar a n-esima posição de memória e
gravar X bytes a partir da mesma.
Conceito de cabeçote de leitura:
• Primeiro posicionar o cabeçote leitura (posição de memória)
• Depois gravar dados em formato binário, um byte por vez.
Cabeçote de leitura/escrita
Memória: bytes da stream
Programação com streams em C++
Leitura baixo-nível:
Exemplo: gravar o inteiro 2361 na posição 3
memória.
Conceito de cabeçote de leitura:
• Converter número em bytes:(00000000 00000000 00001001 00111001)
• Primeiro posicionar o cabeçote leitura na posição 3.
• Depois gravar dados em formato binário, um byte por vez.
Cabeçote de leitura/escrita
Memória: bytes da stream
Programação com streams em C++
Leitura baixo-nível:
Exemplo: gravar o inteiro 2361 na posição 3
memória.
Conceito de cabeçote de leitura:
• Converter número em bytes:
(00000000 00000000 00001001 00111001)
• Primeiro posicionar o cabeçote leitura na posição 3.
• Depois gravar dados em formato binário, um byte por vez.
Cabeçote de leitura/escrita
Memória: bytes da stream
Programação com streams em C++
Leitura baixo-nível:
Exemplo: gravar o inteiro 2361 na posição 3
memória.
Conceito de cabeçote de leitura:
• Converter número em bytes:
(00000000 00000000 00001001 00111001)
• Primeiro posicionar o cabeçote leitura na posição 3.
• Depois gravar dados em formato binário, um byte por vez.
Cabeçote de leitura/escrita
Memória: bytes da stream
Programação com streams em C++
Leitura baixo-nível:
Exemplo: gravar o inteiro 3241 na posição 9
memória.
Conceito de cabeçote de leitura:
• Converter número em bytes:(00000000 00000000 00001100 10101001)
• Primeiro posicionar o cabeçote leitura na posição 9.
• Depois gravar dados em formato binário, um byte por vez.
Cabeçote de leitura/escrita
Memória: bytes da stream
Programação com streams em C++
Lê ou escreve um certo número de bytes
Escrita
char buffer[80]
seekp(10); //Posiciona para escrita
cout.write(buffer,20) //Escreve 20 carac.
Leitura
cin.seekg(10); //Posiciona para leitura
cin.read(buffer,20) //lê 20 caracteres
Número de caracters lidos na última operação
de entrada
Programação com streams em C++
Para outros tipos de dados (não char[] ou char *):
Deve-se fazer a conversão de para array de bytes (char []) Comando reinterpret_cast: int v = 1; cout.write(reinterpret_cast<const char*>(&v),sizeof(v)); cin.read(reinterpret_cast<char*>(&v),sizeof(v)); Pessoa p; cout.write(reinterpret_cast<const char*>(&p),sizeof(p)); cin.read(reinterpret_cast<char*>(&p),sizeof(p));Veremos mais sobre
Veremos mais sobre reinterpret_castreinterpret_cast na na apresenta
apresentaçção sobre arquivos, para utilizaão sobre arquivos, para utilizaçção ão de