Manipulação de Streams e arquivos

Transcrição

Manipulação de Streams e arquivos
Manipulação de
Streams e arquivos
Prof. Leandro Tonietto
Estruturas de Dados em C++ - Unisinos
[email protected]
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
Software
cout
cout <<
<<
“Teste”;
“Teste”;
Software
cin
cin >>
>>
dado;
dado;
Stream
de escrita
/ saída
Dispositivo
de saída
> teste
0010010110010100101111001
Stream
de leitura
/ entrada
0010010110010100101111001
Dispositivo
de entrada
Introduçã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.
• 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;
Atenção: quando ocorre a leitura de uma string
}
com getline() após a leitura de de dados
numéricos deve-se fazer cin.get() 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.
Memória: bytes da stream
0
1 2 3
4 ...
Cabeçote de leitura/escrita
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.
Memória: bytes da stream
0
1 2 3
4 ...
Cabeçote de leitura/escrita
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.
Memória: bytes da stream
0
1 2 3
4 ...
Cabeçote de leitura/escrita
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.
Memória: bytes da stream
0
1 2 3
4 ...
Cabeçote de leitura/escrita
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.
Memória: bytes da stream
0
1 2 3
4
Cabeçote de leitura/escrita
9 10 11 ...
n
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 reinterpret_cast na
apresentação sobre arquivos, para utilização
de cin e cout faremos leitura alto-nível

Documentos relacionados

C++ - Operações com arquivos Em C++, as classes iostream são

C++ - Operações com arquivos Em C++, as classes iostream são um lugar de recebimento ou envio de bytes. O conceito de arquivo é ampliado no sentido de considerar não somente os que existem em disco mas também o teclado, o vídeo, a impressora e as portas de c...

Leia mais