A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 Pearson Education Slide 1

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

3 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

4 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

5 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

6 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

7 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

8 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

9 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 Colocadas no std namespace

10 Pearson Education Slide 10 Bibliotecas de E/S de Arquivo Permitem ambos: entrada de arquivo e saída em seu programa: #include using namespace std; OU #include using std::ifstream; using std::ofstream;

11 Pearson Education Slide 11 Declarando Streams Stream deve ser declarado como qualquer outra 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

12 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

13 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

14 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

15 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

16 Pearson Education Slide 16 Exemplo: Arquivo Painel 12.1 página 346

17 Pearson Education Slide 17 Exemplo: Arquivo (cont) Painel 12.1 página 347

18 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 2 o argumento é uma constante definida na classe ios Na biblioteca e no std namespace

19 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");

20 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-sucedida if (streamDeEntrada.fail( )) { cout << "A abertura do arquivo de entrada falhou.\n"; exit(1); }

21 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

22 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

23 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 e false, quando seu código tenta ler além do final do arquivo. Na prática: double proximo, soma = 0; while (streamDeEntrada >> proximo) soma = soma + proximo; cout << "a soma é " << soma << endl;

24 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ável char 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

25 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.

26 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

27 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

28 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 e no std namespace

29 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);

30 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 e no std namespace

31 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 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

32 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

33 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

34 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);

35 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

36 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

37 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

38 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

39 Pearson Education Slide 39 Exemplo de Herança entre Classes Stream Painel página 365

40 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

41 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

42 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 1000 o byte rwStream.seekg(1000); Posiciona o ponteiro de saída no 1000 o byte

43 Pearson Education Slide 43 Acesso Aleatório: Tamanhos Para dar um giro precisa saber o tamanho O operador sizeof() determina o número de bytes 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);

44 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

45 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


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google