manipula ção de streams e arquivos -...
TRANSCRIPT
ManipulaManipulaçção de ão de
StreamsStreams e arquivose arquivos
Prof. Leandro ToniettoEstruturas de Dados em C++ - Unisinos
[email protected]://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
Streamde escrita / saída
Dispositivo de saída
0010010110010100101111001cin >>
dado;
cin >>
dado;
Software
Streamde leitura / entrada Dispositivo
de entrada
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.
• Não recomendado para grandes quantidades de dados.
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?– Alto nível
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;
}AtenAtenççãoão: quando ocorre a leitura de uma string : quando ocorre a leitura de uma string
com com getlinegetline()() 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.limpar o buffer antes de ler a string.
Programação com streams em C++
Pode ser usado tanto para streams de entrada e saídaConforme ocorrem erros, alguns bits são marcadosAbaixo 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
0 1 2 3 4 ... n
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
0 1 2 3 4 ... n
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
0 1 2 3 4 ... n
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
0 1 2 3 4 ... n
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
0 1 2 3 4 n9 10 11 ...
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� cin.gcount()
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
apresentaapresentaçção sobre arquivos, para utilizaão sobre arquivos, para utilizaçção ão de de cincin e e coutcout faremos leitura altofaremos leitura alto--nníívelvel