Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H....

45
Pearson Education Slide 1

Transcript of Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H....

Page 1: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 1

Page 2: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 2

Capítulo 12

Criado por Frederick H. Colclough, Colorado Technical University

E/S de Arquivo e Streams

Page 3: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 3

Objetivos de Estudo Streams de E/S

E/S de arquivo E/S de caractere

Ferramentas para E/S de streams Nomes de arquivos como entrada Formatando a saída, configurações de flags

Hierarquias de Stream: Introdução de Herança

Acesso Aleatório a Arquivos

Page 4: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 4

Introdução Streams

Objetos Especiais Permite ao programa receber e dar saída

E/S de arquivo Utiliza Herança

Não explicada até o capítulo 14 E/S de arquivo é muito útil, então veremos

aqui alguma coisa

Page 5: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 5

Streams Um fluxo de caracteres Stream de Entrada

Fluxo para dentro do programa Pode vir do teclado Pode vir de um arquivo

Stream de Saída Fluxo para fora do programa

Pode ir para a tela Pode ir para um arquivo

Page 6: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 6

Uso de Streams Nós já usamos streams

cin stream de entrada conectado ao teclado

cout stream de saída conectado à tela

Pode-se definir outros streams Para os arquivos, ou dos arquivos Usado da mesma maneira que cin e cout

Page 7: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 7

Uso de Streams como cin, cout Considere:

suponha que seu programa defina um stream chamado

streamDeEntrada que venha de algum arquivo:int oNumero;

streamDeEntrada >> oNumero; Lê valores do stream , atribuídos a oNumero

Se seu programa definir um stream de saída chamado

streamDeSaida que vai para outro arquivo:

streamDeSaida << "oNumero é " << oNumero << endl; Envia valores para o stream , os quais vão para o

arquivo

Page 8: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 8

Arquivos Nós usaremos arquivos de texto Lendo a partir do arquivo

Quando o programa retira entrada de uma arquivo

Escrevendo no arquivo Quando o programa envia a saída para um

arquivo

Do começo até o fim do arquivo Existem outros métodos disponíveis Nós dicutiremos este acesso a uma arquivo

de texto simples

Page 9: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 9

Conexão de arquivos Deve-se primeiro conectar o arquivo ao

objeto stream Para entrada:

Arquivo objeto ifstream Para saída:

Arquivo objeto ofstream Classes ifstream e ofstream

Definidas na biblioteca <fstream> Colocadas no std namespace

Page 10: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 10

Bibliotecas de E/S de Arquivo Permitem ambos: entrada de arquivo e

saída em seu programa:

#include <fstream>using namespace std;

OU

#include <fstream>using std::ifstream;using std::ofstream;

Page 11: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 11

Declarando Streams Stream deve ser declarado como

qualqueroutra variável de classe:

ifstream streamDeEntrada;

ofstream streamDeSaida; Deve-se então ‘conectar’ ao arquivo:

streamDeEntrada.open("arqentra.txt"); Chamado de ‘abrir o arquivo’

É feito com a função-membro chamada open Pode-se especificar um caminho completo

Page 12: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 12

Uso de Streams Uma vez declarados use normalmente!

int umNumero, outroNumero;

streamDeEntrada >> umNumero >> outroNumero; Stream de saída é parecido:

ofstream streamDeSaida;

streamDeSaida.open("arqsaida.txt");streamDeSaida << "umNumero = " << umNumero

<< " outroNumero = " << outroNumero; Envia items para o aquivo de saída

Page 13: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 13

Nomes de Arquivo Programas e arquivos Arquivos têm dois nomes para nossos programas

Nome externo do arquivo Também chamado de ‘nome de arquivo físico’ Como ‘arqentra.txt’ Algumas vezes considerado ‘nome verdadeiro do arquivo’ Somente usado uma vez no programa (para abrir)

Nome do stream Também chamado ‘nome lógico do arquivo’ O programa usará esse nome para todas as ativiades

Page 14: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 14

Fechando Files Arquivos devem ser fechados

Quando o programa termina de retirar entrada

ou enviar saída para o arquivo Desconecte o stream do arquivo Na prática:

streamDeEntrada.close( );

streamDeSaida.close( ); Note que não existem argumentos

Os arquivos são fechados automaticamente

quando o programa termina

Page 15: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 15

Arquivos: Flush Saída é freqüentemente colocada em ‘buffer’

Temporariamente armazenada antes de ser escrita no arquivo

Escrita em ‘grupos’ Algumas vezes pode ser necessário forçar a escrita:

streamDeSaida.flush( ); Função-membro flush, para todos os streams de saída Todos os dados do buffer são escritos fisicamente

Uma invocação a close invoca flush()

automaticamente

Page 16: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 16

Exemplo: ArquivoPainel 12.1 página 346

Page 17: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 17

Exemplo: Arquivo (cont)

Painel 12.1

página 347

Page 18: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 18

Anexando a um Arquivo Operação de abertura padrão inicia com

um arquivo vazio Mesmo se ele já existe o conteúdo é perdido

Abrir para anexar:ofstream streamDeSaida;

streamDeSaida.open("importante.txt", ios::app); Se o arquivo não existir cria o arquivo Se existir anexa ao final 2o argumento é uma constante definida na classe ios

Na biblioteca <iostream> e no std namespace

Page 19: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 19

Sintaxe Alternativa para Abertura de Arquivos

Pode-se especificar o nome do arquivo

na declaração Passado como argumento ao construtor

ifstream streamDeEntrada;

streamDeEntrada.open("arqentra.txt");

Equivalente a:

ifstream streamDeEntrada("arqentra.txt");

Page 20: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 20

Verifique se a Abertura de um Arquivo foi bem-sucedida

Abertura de arquivos podem falhar: Se o arquivo de entrada não existir Falta de permissão para escrever no arquivo de saída Resultados inesperados

Função-membro fail() Chame fail() para verificar se a operação com

o

stream foi bem-sucedidaif (streamDeEntrada.fail( ))

{

cout << "A abertura do arquivo de entrada falhou.\n";

exit(1);

}

Page 21: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 21

E/S de Caractere com arquivos Tudo sobre E/S de caracteres com cin e cout

se aplica para arquivos! Funções-membros trabalham do mesmo

modo: Get e getline Put e putback Peek e ignore

Page 22: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 22

Verificando o Final de um Arquivo Usar loop para processar o arquivo até o

final Duas maneiras de testar o final do aquivo:

Função-membro eof()streamDeEntrada.get(proximo);

while (! streamDeEntrada.eof( ))

{

cout << proximo;

streamDeEntrada.get(proximo);

}

Lê cada caractere até o final do arquivo A função-membro eof() retorna um tipo bool

Page 23: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 23

Verificando o Final do Arquivo com Leitura

Segundo método Leitura com um operador de extração retorna

um valor bool!(streamDeEntrada >> proximo)

Retorna true, se a leitura foi bem-sucedida efalse, quando seu código tenta ler além do finaldo arquivo.

Na prática:double proximo, soma = 0;while (streamDeEntrada >> proximo)soma = soma + proximo;cout << "a soma é " << soma << endl;

Page 24: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 24

Ferramentas: Nomes de Arquivos como Entrada

Operações de Abertura Stream Argumento para open() é tipo string

Pode ser literal (usado até agora) ou variávelchar nomeDoArquivo[16];

Ifstream streamDeEntrada;

cout << "Forneça o nome do arquivo (máx de 15 caracteres):\n";

cin >> nomeDoArquivo;

streamDeEntrada.open(nomeDoArquivo); Fornece mais flexibilidade

Page 25: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 25

Formatando a Saída com Funções Stream

Lembre-se do capítulo 1 ‘fórmula mágica’:cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(2); Números no formato ‘dinheiro’ (12.52) Pode-se usar sobre qualquer saída Stream

Streams de saída conectadas a um arquivo

têm essas mesmas funções-membros que

o objeto cout.

Page 26: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 26

Funções-membros de Saída Considere:

outStream.setf(ios::fixed);outStream.setf(ios::showpoint);outStream.precision(2);

Função-membro precision(x) Decimais escritos com ‘x’ dígitos após o ponto

decimal

Função-membro setf() Permite vários tipos de saída fixando os

flags

Page 27: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 27

Mais sobre Funções-membros de Saída

Considere:outStream.width(5);

Função-membro width(x) Fixa a largura em ‘x’ para os valores de

saída Somente afeta ‘o próximo’ valor de saída Deve-se fixar a largura antes de cada valor

para afetar a todos

Page 28: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 28

Flags Lembre-se: função-membro setf()

Fixa a condição dos flags de saída Todo stream de saída tem o membro

setf() Flags são constantes na classe ios

Na biblioteca <iostream>e no std namespace

Page 29: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 29

Exemplos de setf() Flags:

outStream.setf(ios::fixed); Fixa a notação de ponto fixo (decimal)

outStream.setf(ios::showPoint) Sempre inclui um ponto decimal

outStream.setf(ios::right); Fixa a justificação à direita

Fixe múltiplos flags com uma única chamada:outStream.setf(ios::fixed | ios::showpoint |

ios::right);

Page 30: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 30

Manipuladores Manipulator definido como:

“função chamada de modo não-tradicional.”

Pode ter argumentos Colocados depois do operador de inserção Excuta o mesmo que a função-membro !

De um modo diferente Normalmente usados ‘juntos’

setw() e setprecision() estão na biblioteca<iomanip> e no std namespace

Page 31: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 31

Example: Manipulador setw()

Manipulador setw() :cout << "Início" << setw(4) << 10

<< setw(4) << 20 << setw(6) << 30; O comando anterior produzirá a seguinte saída:

Início 10 20 30

Note: setw() afeta somente o próximo

valor apresentado Deve-se incluir o manipulador setw() antes de

cada item na saída para afetar a todos

Page 32: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 32

Manipulador setprecision() Manipulador setprecision() :

cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout << "R$" << setprecision(2) << 10.3 << endl

<< "R$" << 20.5 << endl; O comando anterior produzirá a seguinte saída:

R$ 10,30

R$ 20,50

Page 33: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 33

Salvando Configurações de Flags Configurações de Flag ‘permanecem’ até

que sejas modificadas Os flags fixados por precision e setf

podem ser salvos e restaurados

Função precision() retorna a configuração atual

se chamada sem argumentos A função-membro flags() fornece capacidade

similar

Page 34: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 34

Exemplo: Salvando Configurações de Flags

void outputStuff(ofstream& streamDeSaida)

{

int precisionSetting = streamDeSaida.precision( );

long flagSettings = streamDeSaida.flags( );

streamDeSaida.setf(ios::fixed);

streamDeSaida.setf(ios::showpoint);

streamDeSaida.precision(2);

Faça o que quiser aqui.

streamDeSaida.precision(precisionSetting);

streamDeSaida.flags(flagSettings);

}

Função típica para salvar e restaurar configurações

Chamada: outputStuff(minhaStream);

Page 35: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 35

Restaurando as Configurações-Padrão de setf

Pode-se também restaurar as configurações-padrão:

cout.setf(0, ios::floatfield); Não necessariamente a ‘última’

configuração! Valores-padrão dependem da

implementa-ção

Não restaura as configurações de precision

Somente as configurações de setf

Page 36: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 36

Hierarquias de Streams Relacionamentos de classes

‘Derivada de” Uma classe é obtida a partir de outra classe Então os recursos são ‘adicionados’

Exemplo: A classe de streams de arquivos de entrada

é

derivada da classe de todos os streams de entrada

Então são adicionadas as funções-membros open and close

ex.: ifstream é derivada de istream

Page 37: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 37

Exemplo ‘Real’ de Herança entre Classes A classe de todos os conversíveis, por

exemplo,

é uma classe derivada da classe de todos os

automóveis Cada conversível é um automóvel Um conversível possui ‘características

adicionais’

que um automóvel

Page 38: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 38

Herança entre Classes Stream Considere: Se D é uma classe derivada da classe B

Todos os objetos do tipo D são também do tipo B ex.: Um conversível é também um automóvel

Com relação às streams: Um objeto ifstream é também um objeto

istream Se utilizamos istream como tipo para um parâmetro de

função, em vez de utilizar ifstream, mais objetos podem

ser conectados ao parâmetro

Page 39: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 39

Exemplo de Herança entre Classes Stream

Painel página 365

Page 40: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 40

Exemplo de Herança entre Classes Stream Chamadas

Considerando a função anterior: duasSomasVersao1(arquivoEntrada); // Legal! duasSomasVersao1(cin); // ILEGAL!

Porque cin não é de tipo ifstream.! duasSomasVersao2(arquivoEntrada); // Legal! duasSomasVersao2(cin); // Legal!

Mais versátil Parâmetro istream aceita ambos os objetos

Page 41: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 41

Acesso Aleatório a Arquivos Acesso Seqüencial

Mais comumente usado Acesso Aleatório

Acesso rápido para gravar Talvez bancos de dados muito grandes Acessa ‘aleatoriamente’ qualquer parte do

arquivo Use objetos fstream

entrada e saída

Page 42: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 42

Ferramentas de Acesso Aleatório Abertura é a mesma de istream ou

ostream Possui um segundo argumento fstream rwStream;

rwStream.open(“algo”, ios::in | ios:: out); Abre com capacidade de leitura e escrita

“Dar um giro” no arquivo rwStream.seekp(1000);

Posiciona o ponteiro de entrada no 1000o byte rwStream.seekg(1000);

Posiciona o ponteiro de saída no 1000o byte

Page 43: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 43

Acesso Aleatório: Tamanhos Para “dar um giro” precisa saber o tamanho

O operador sizeof() determina o número debytes requeridos por um objeto:sizeof(s) // em que s é a string s = "Oi";

sizeof(10)sizeof(double)sizeof(meuStruct)

Para instalar o ponteiro de entrada no

centésimo registro de tipo MeuStruct:

rwStream.seekp(100*sizeof(meuStruct) – 1);

Page 44: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 44

Sumário 1 Streams conectam-se a arquivos com chamada

à função open fail() verifica se a chamada à função-membro

foi bem-sucedida Funções-membros de Stream formatam a saída

ex.: width, setf, precision Mesmo uso para cout (tela) ou arquivos

Tipos Stream podem ser parâmetros formais mas devem ser chamados por referência

Page 45: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H. Colclough, Colorado Technical University E/S de Arquivo e Streams.

Pearson Education Slide 45

Sumário 2 Parâmetros istream (sem o ‘f’) aceitam objetos

cin ou ifstream como argumentos Parâmetros ostream (sem o ‘f) aceitam objetos

cout ou ofstream como argumentos Função-membro eof

Usada para testar o fim de um arquivo