manipula ção de streams e arquivos -...

21
Manipula Manipula ç ç ão de ão de Streams Streams e arquivos e arquivos Prof. Leandro Tonietto Estruturas de Dados em C++ - Unisinos [email protected] http://www.inf.unisinos.br/~ltonietto mar-09

Upload: nguyentruc

Post on 10-Nov-2018

215 views

Category:

Documents


0 download

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

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;

}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