Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H....
Transcript of Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 12 Criado por Frederick H....
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
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
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
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
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
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
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
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;
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
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
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
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
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
Pearson Education Slide 16
Exemplo: ArquivoPainel 12.1 página 346
Pearson Education Slide 17
Exemplo: Arquivo (cont)
Painel 12.1
página 347
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
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");
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);
}
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
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
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;
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
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.
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
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
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
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);
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
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
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
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
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);
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
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
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
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
Pearson Education Slide 39
Exemplo de Herança entre Classes Stream
Painel página 365
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
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
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
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);
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
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