·
Engenharia Elétrica ·
Linguagens de Programação
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
33
Entradas e Saídas de Fluxo em C: Teorias e Técnicas
Linguagens de Programação
UFPA
11
Exercícios de Programação em C++: Consulta Médica, Conta Corrente e Marcação de Exame
Linguagens de Programação
UFPA
48
Tratamento de Exceções em Linguagens de Programação
Linguagens de Programação
UFPA
1
Ementa do Componente Curricular TE05270 - Técnicas e Linguagens de Programação
Linguagens de Programação
UFPA
1
Desenvolvendo uma Conta Corrente em C: Estruturação e Métodos
Linguagens de Programação
UFPA
1
Desenvolvimento de Aplicação com Bibliotecas em C++
Linguagens de Programação
UFPA
1
Atividade Prática: Criação de Circuito Lógico com Display de Sete Segmentos
Linguagens de Programação
UFPA
1
Algoritmo Peso Ideal - Classificacao por Peso em Pascal
Linguagens de Programação
UFPA
1
Anodo Comum: Princípios e Aplicações
Linguagens de Programação
UFPA
1
Programa em Pascal para Classificacao de Peso
Linguagens de Programação
UFPA
Texto de pré-visualização
Processamento de arquivo Tecnicas e Linguagens de Programacao Paulo Bentes UFPAITECFEEB June 8 2021 Processamento de arquivo Sumario Sumario 1 Introducao 2 Codigos 3 Variaveis de ambiente 4 Registro 5 Arquivos e fluxos 6 Criando um arquivo sequencial 7 Lendo dados de um arquivo sequencial 8 Problemas de atualizacao em arquivos de acesso sequencial 9 Arquivos de acesso aleatorio 10 Exercıcio 11 Referˆencias Processamento de arquivo Introducao Introducao Introducao O armazenamento de dados em variaveis arrays estruturas e objetos e realizado na memoria de acesso aleatorio RAM Random Access Memory e e temporario Os arquivos sao utilizados para persistˆencia de dados retencao permanente dos dados Os computadores armazenam arquivos em dispositivos de armazenamento secundarios como discos rıgidos HD Hard Disk discos opticos fitas e dispositivos de estado solido SSD Solid State Drive ou Flash Processamento de arquivo Codigos Codigos Codigo binario Computadores eletrˆonicos representam os codigos com apenas dois estados estaveis 0 e 1 que sao a representacao de condicoes fısicas tais como passar corrente e nao passar corrente ou mesmo dois nıveis de tensao eletrica A representacao de um estado e chamada de bit Numeros decimais na base 10 inteiros int ou fracionarios floatdouble podem ser representados por numeros binarios na base 2 Ex 2 bits podem representar ate 4 22 numeros decimais 0 3 0 00 1 01 2 10 3 11 Processamento de arquivo Codigos Codigos Cont Ex 5 bits podem representar ate 32 25 numeros decimais 0 31 0 00000 10 01010 20 10100 30 11110 1 00001 11 01011 21 10101 31 11111 2 00010 12 01100 22 10110 3 00011 13 01101 23 10111 4 00100 14 01110 24 11000 5 00101 15 01111 25 11001 6 00110 16 10000 26 11010 7 00111 17 10001 27 11011 8 01000 18 10010 28 11100 9 01001 19 10011 29 11101 Nota Para se conseguir representar 256 28 valores decimais 0 255 ou sımbolos serao necessarios 8 bits que formam um Byte Processamento de arquivo Codigos Codigos Cont 2 int Um inteiro em muitos compiladores sera representado por 2 Bytes 16 bits sendo 15 bits destinados a representacao do numero e 1 bit para representar o sinal entao a faixa de representacao sera de 32768 a 32767 unsigned int Inteiro sem sinal tambem representado por 2 Bytes sua faixa de representacao sera de 0 a 65535 Processamento de arquivo Codigos Codigos Cont 3 float Numero de ponto flutuante representado normalmente por 4 Bytes sua faixa sera de 34 E38 a 34 E38 double Numero de ponto flutuante representado normalmente por 8 Bytes sua faixa sera de 17 E308 a 17 E308 Nota As tecnicas de converao de decimal para binario ou o contrario para numero inteiros ou de ponto flutuante podem ser verificadas em Idoeta Capuano 1984 Processamento de arquivo Codigos Codigos Cont 4 char A representacao simbolica atraves do char e feita com apenas 1 Byte e permite expressar 256 caracteres O caractere vem a ser um sımbolo tipografico para escrever texto em alguma lıngua Pode incluir letras numeros ou qualquer outra expressao simbolica wchar t A representacao simbolica atraves do wchar t e feita com mais de 1 Byte e permite expressar o conjunto Unicode que atribui nomes numericos code points a mais de um milhao de caracteres Ex U0021 9 U0039 A U0041 a U0061 U0022 U002D B U0042 b U0062 Processamento de arquivo Codigos Codigos Cont 5 Codigo ASCII Os primeiros 128 caracteres da lista Unicode de U0000 a U007F sao os mais usados e e conhecido como alfabeto ASCII e necessita de apenas 1 Byte para representalos e podem ser representados por hexadecimal pois estao no inıcio da lista Unicode Ex 0x21 9 0x39 A 0x41 a 0x61 0x22 0x2D B 0x42 b 0x62 Codigo ISOLATIN1 Um Byte 8 bit e capaz de representar 256 caracteres e o codigo ISOLATIN1 faz exatamente isso No entanto esse codigo caiu em desuso Processamento de arquivo Codigos Codigos Cont 6 Codigo UTF8 O alfabeto Unicode tem mais de 1 milhao caracteres Portanto o codigo de cada caractere precisaria de pelo menos 3 Bytes perante a notacao binaria Usar um numero fixo de Bytes por caractere nao seria eficiente ja que 1 Byte e suficiente para codificar os caracteres mais comuns A solucao e recorrer a um codigo multibyte que emprega um numero variavel de Bytes por caractere alguns caracteres usam 1 Byte outros usam 2 Bytes e assim por diante Processamento de arquivo Exemplos de UTF8 Alguns exemplos da utilizagao dos cédigos em UTF8 U0021 0x21 00100001 U0022 0x22 00100010 9 U0039 0x39 00100111 U002D 0x2D 00101101 y U00FF OxC3BF 11000011 10111111 UCEA3 OxCEA3 11001110 10100011 U2014 0xE28094 11100010 10000000 10010100 U201C 0xE2809C 11100010 10000000 10011100 Processamento de arquivo Variaveis de ambiente Variaveis de ambiente Locales O comportamento de qualquer programa depende das variaveis de ambiente environment variables configurado no sistema operacional Essas variaveis especificam a lıngua e o esquema de codificacao padrao Digite locale no terminal de seu sistema operacional para obter o valor de todas as variaveis de ambiente Processamento de arquivo Variaveis de ambiente Variaveis de ambiente Cont locale LANGpt BRUTF8 LC CTYPEpt BRUTF8 LC NUMERIC pt BRUTF8 LC TIMEpt BRUTF8 LC COLLATE pt BRUTF8 LC MONETARYpt BRUTF8 LC MESSAGESpt BRUTF8 LC PAPERpt BRUTF8 LC NAMEpt BRUTF8 LC ADDRESSpt BRUTF8 LC TELEPHONEpt BRUTF8 LC MEASUREMENTpt BRUTF8 LC IDENTIFICATIONpt BRUTF8 LC ALL Processamento de arquivo Registro Registro Em geral um registro que pode ser representado como uma classe em C e um grupo de campos relacionados chamados membros de dados em C Em um sistema de folha de pagamento por exemplo um registro para um empregado particular poderia incluir os seguintes campos 1 Numero de identificacao do empregado 2 Nome 3 Endereco 4 Salariohora 5 Numero de isencoes reivindicadas 6 Lucros no ano ate a data atual 7 Total de impostos retidos Processamento de arquivo Arquivos e fluxos Arquivos Um arquivo e um grupo de registros relacionados Para facilitar a recuperacao de registros especıficos de um arquivo pelo menos um campo em cada registro e escolhido como uma chave de registro Uma chave de registro identifica um registro como pertencendo a uma pessoa ou entidade particular e distingue esse registro de todos os outros No registro de folha de pagamento descrito previamente o numero de identificacao de empregado normalmente seria escolhido como a chave de registro Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Arquivos e fluxos Quando um arquivo e aberto um objeto e criado e um fluxo e associado com o objeto Os objetos cin cout cerr e clog sao criados a partir da biblioteca iostream Os fluxos associados com esses objetos fornecem canais de comunicacao entre um programa e um arquivo ou dispositivo particular Por exemplo o objeto cin permite a um programa inserir dados a partir do teclado ou outros dispositivos o objeto cout permite a um programa gerar saıda de dados para a tela ou outros dispositivos e os objetos cerr e clog permitem a um programa gerar saıda de mensagens de erro para a tela ou outros dispositivos Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Cont Para realizar processamento de arquivo no C os arquivos de cabecalho iostream e fstream devem ser incluıdos O cabecalho fstream inclui as definicoes para os templates de classe de fluxo basic ifstream para entrada de arquivo basic ofstream para saıda de arquivo e basic fstream para entrada e saıda de arquivo Cada template de classe tem uma especializacao de template predefinida que permite a ES de char Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Cont2 A biblioteca fstream fornece um conjunto de typedefs que fornecem aliases dessas especializacoes de template O typedef ifstream representa uma especializacao de basic ifstream que permite a entrada de char a partir de um arquivo De modo semelhante o typedef ofstream representa uma especializacao de basic ofstream que permite a saıda de char para arquivos Alem disso o typedef fstream representa uma especializacao de basic fstream que permite entrada de char a partir de arquivos e a saıda de char para arquivos Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial O C nao impoe nenhuma estrutura a um arquivo Assim um conceito como o de registro nao existe em um arquivo C No exemplo a seguir vemos como o programador impoe uma estrutura simples de registro a um arquivo Figure 1 A visao do C de um arquivo de n bytes Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont Combinacoes de tecla de fim de arquivo UNIXLinuxMac OS X ctrld em uma linha isolada Microsoft Windows ctrlz as vezes seguido pela tecla Enter VAX VMS ctrlz Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont2 Usamos o conceito de registro para criar um arquivo sequencial simples que poderia ser utilizado em um sistema de contas a receber para ajudar a gerenciar o dinheiro devido por clientes de uma empresa Para cada cliente o programa obtem o numero da conta do cliente nome e saldo O numero da conta serve como a chave de registro nesse aplicativo isto e o programa cria e mantem o arquivo na ordem de numeros de conta Esse programa assume que o usuario insere os registros na ordem de numeros de conta Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont3 Arquivos sao abertos criando os objetos ifstream ofstream ou fstream No exemplo o arquivo deve ser aberto para saıda portanto um objeto ofstream e criado Dois argumentos sao passados para o construtor do objeto o nome de arquivo e o modo fileopen Para um objeto ofstream o modo fileopen pode ser iosout para gerar saıda de dados em um arquivo ou iosapp para acrescentar dados ao fim de um arquivo sem modificar quaisquer dados ja presentes no arquivo Arquivos existentes abertos com o modo iosout sao truncados todos os dados no arquivo sao descartados Se o arquivo especificado ainda nao existir entao ofstream cria o arquivo utilizando esse nome de arquivo Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont4 Ex Cria um arquivo sequencial Arquivo Fig17 04cpp include iostream using stdcerr using stdcin using stdcout using stdendl using stdios include fstream fluxo de arquivo using stdofstream gera a saıda do fluxo do arquivo include cstdlib using stdexit sai do prototipo de funcao Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont5 int main construtor ofstream abre arquivo ofstream outClientFile clientsdat iosout fecha o programa se nao conseguir criar arquivo if outClientFile operador sobrecarregado cerr File could not be opened endl exit 1 argumento nao zero indicando termino anormal fim do if cout Enter the account name and balance endl Enter end of file to end input int account char name 30 double balance Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont6 lˆe conta nome e saldo a partir de cin entao coloca no arquivo while cin account name balance outClientFile account name balance endl cout fim do while return 0 destrutor ofstream fecha o arquivo fim de main Nota Por padrao os objetos ofstream sao abertos para saıda entao o codigo poderia ter executado a instrucao ofstream outClientFile clientsdat Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont7 Enter the account name and balance Enter endoffile to end input 100 Jones 2498 200 Doe 34567 300 White 000 400 Stone 4216 500 Rich 22462 ˆ Z Uma vez que o usuario insere o indicador de fim do arquivo main termina Isso invoca a funcao destrutora do objeto outClientFile implicitamente o que fecha o arquivo clientsdat O programador tambem pode fechar o objeto ofstream explicitamente utilizando a funcaomembro close na instrucao outClientFileclose Processamento de arquivo Criando um arquivo sequencial Modos de fileopen Modos de fileopen iosapp Acrescenta toda saıda ao fim do arquivo iosate Abre um arquivo para saıda e movese para o fim do arquivo normalmente utilizado para acrescentar dados a um arquivo Os dados podem ser gravados em qualquer lugar do arquivo iosin Abre um arquivo para a entrada iosout Abre um arquivo para a saıda iostrunc Descarta o conteudo do arquivo se ele existir essa tambem e a acaopadrao de iosout iosbinary Abre um arquivo para entrada ou saıda binaria isto e naotexto Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Os arquivos armazenam dados de modo que eles possam ser recuperados para processamento quando necessario O proximo exemplo lˆe os registros do arquivo clientsdat que criamos e exibe o conteudo desses registros Criar um objeto ifstream abre um arquivo para entrada O construtor ifstream pode receber o nome do arquivo e o modo de abertura do arquivo como argumentos O codigo cria um objeto ifstream chamado inClientFile e o associa com o arquivo clientsdat Os argumentos entre parˆenteses sao passados para a funcao construtora ifstream que abre o arquivo e estabelece uma linha de comunicacao com o arquivo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont2 Ex Lendo e imprimindo um arquivo sequencial Arquivo Fig17 07cpp include iostream using stdcerr using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint include fstream fluxo de arquivo using stdifstream insere fluxo de arquivo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont3 include iomanip using stdsetw using stdsetprecision include string using stdstring include cstdlib using stdexit sai do prototipo de funcao void outputLine int const string double prototipo int main construtor ifstream abre o arquivo ifstream inClientFile clientsdat iosin Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont4 fecha o programa se ifstream nao pˆode abrir o arquivo if inClientFile cerr File could not be opened endl exit 1 fim do if int account char name 30 double balance cout left setw10 Account setw13 Name Balance endl fixed showpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont5 exibe cada registro no arquivo while inClientFile account name balance outputLine account name balance return 0 destrutor ifstream fecha o arquivo fim de main exibe um registro do arquivo void outputLine int account const string name double balance cout left setw10 account setw13 name setw7 setprecision2 right balance endl fim da funcao outputLine Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont6 Lendo a partir do inıcio do arquivo Nos exemplos anteriores os programas comecam a ler a partir do inıcio do arquivo e lˆeem todos os dados consecutivamente ate que os dados desejados sejam encontrados Lendo a partir de outras posicoes do arquivo Tanto istream como ostream fornecem funcoesmembro para reposicionar o ponteiro de posicao do arquivo o numero de bytes ate o proximo byte no arquivo a ser lido ou gravado Essas funcoesmembro sao seekg seek get para istream que indica o numero de bytes no arquivo a partir do qual a proxima entrada deve ocorrer e seekp seek put para ostream que indica o numero de bytes no arquivo em que a proxima saıda deve ser colocada Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont7 O argumento para seekg ou seekp normalmente e um inteiro long Um segundo argumento pode ser especificado para indicar a direcao de busca seek direction A direcao de busca pode ser iosbeg o padrao para o posicionamento em relacao ao inıcio de um fluxo ioscur para posicionamento em relacao a posicao atual de um fluxo ou iosend para posicionamento em relacao ao fim de um fluxo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont8 Posicao para o enesimo byte de fileObject supoe iosbeg fileObjectseekg n Posiciona n bytes para a frente em fileObject fileObjectseekg n ioscur Posiciona n bytes para tras a partir do fim de fileObject fileObjectseekg n iosend Posiciona no fim de fileObject fileObjectseekg 0 iosend Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont9 Ex Programa de consulta de credito Arquivo Fig17 08cpp include iostream using stdcerr using stdcin using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont10 include fstream using stdifstream include iomanip using stdsetw using stdsetprecision include string using stdstring include cstdlib using stdexit sai do prototipo de funcao enum RequestType ZERO BALANCE 1 CREDIT BALANCE DEBIT BALANCE END int getRequest bool shouldDisplay int double void outputLine int const string double Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont11 int main construtor ifstream abre o arquivo ifstream inClientFile clientsdat iosin fecha o programa se ifstream nao pˆode abrir o arquivo if inClientFile cerr File could not be opened endl exit 1 fim do if int request int account char name 30 double balance obtem a solicitacao do usuario saldo zero credor ou devedor Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont12 request getRequest processa solicitacao do usuario while request END switch request case ZERO BALANCE cout Accounts with zero balances break case CREDIT BALANCE cout Accounts with credit balances break case DEBIT BALANCE cout Accounts with debit balances break fim do switch Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont13 lˆe a conta nome e saldo do arquivo inClientFile account name balance exibe conteudo do arquivo ate eof while inClientFileeof exibe o registro if shouldDisplay request balance outputLine account name balance lˆe a conta o nome e o saldo do arquivo inClientFile account name balance fim do while interno inClientFileclear redefine eof para proxima entrada inClientFileseekg 0 reposiciona no comeco de arquivo request getRequest obtem solicitacao adicional do usuario fim do while externo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont14 cout End of run endl return 0 destrutor ifstream fecha o arquivo fim de main obtem a solicitacao do usuario int getRequest int request solicitacao do usuario exibe opcoes de solicitacao cout Enter request endl 1 List accounts with zero balances endl 2 List accounts with credit balances endl 3 List accounts with debit balances endl 4 End of run fixed showpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont15 do entrada da solicitacao do usuario cout cin request while request ZERO BALANCE request END return request fim da funcao getRequest determina se exibe um dado registro bool shouldDisplay int type double balance determina se exibe saldos zero if type ZERO BALANCE balance 0 return true Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont16 determina se exibe saldos credores if type CREDIT BALANCE balance 0 return true determina se exibe saldos devedores if type DEBIT BALANCE balance 0 return true return false caso em que todos os ifs falham fim da funcao shouldDisplay exibe um registro do arquivo void outputLine int account const string name double balance cout left setw10 account setw13 name setw7 setprecision2 right balance endl fim da funcao outputLine Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont17 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 1 Accounts with zero balances 300 White 000 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont18 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 2 Accounts with credit balances 400 Stone 4216 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont19 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 3 Accounts with debit balances 100 Jones 2498 200 Doe 34567 500 Rich 22462 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont20 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 4 End of run Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Os arquivos sequenciais sao inadequados aos aplicativos de acesso instantˆaneo em que um registro particular deve ser imediatamente localizado Aplicativos de acesso instantˆaneo comuns sao sistemas de reserva de passagem aerea sistemas bancarios sistemas de pontodevenda caixas automaticos e outros tipos de sistemas de processamento de transacao que requerem acesso rapido a dados especıficos Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Cont Os dados formatados e gravados em um arquivo sequencial nao podem ser modificados sem o risco de destruir outros dados no arquivo Por exemplo se o nome White precisa ser mudado para Worthington o antigo nao pode ser sobrescrito sem corromper o arquivo O registro para White foi gravado no arquivo como 300 White 000 Se esse registro fosse regravado comecando na mesma localizacao do arquivo utilizando o nome mais longo o registro seria 300 Worthington 000 O novo registro contem seis caracteres a mais que o registro original Portanto os caracteres alem do segundo o em Worthington sobrescreveriam o inıcio do proximo registro sequencial no arquivo Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Cont2 O problema e que no modelo de entradasaıda formatada utilizando o operador de insercao de fluxo e o operador de extracao de fluxo os campos e portanto os registros podem variar de tamanho Por exemplo os valores 7 14 117 2074 e 27383 sao todos int que armazenam o mesmo numero de bytes de dados brutos internamente em geral quatro bytes nas atuais maquinas de 32 bits populares Entretanto esses inteiros tornamse campos de diferentes tamanhos quando sua saıda e gerada como texto formatado sequˆencias de caractere Portanto o modelo de entradasaıda formatada normalmente nao e utilizado para atualizar registros no local Processamento de arquivo Arquivos de acesso aleatorio Arquivos de acesso aleatorio Um banco pode ter centenas de milhares ou ate milhoes de outros clientes e ainda assim quando um cliente utiliza um caixa automatico o programa verifica a conta desse cliente em alguns segundos ou menos para saber se ha fundos suficientes Esse tipo de acesso instantˆaneo e possıvel com arquivos de acesso aleatorio Os registros individuais de um arquivo de acesso aleatorio podem ser acessados diretamentee rapidamente sem preciser pesquisar outros registros Os dados podem ser inseridos em um arquivo de acesso aleatorio sem destruir outros dados no arquivo Os dados previamente armazenados tambem podem ser atualizados ou excluıdos sem regravar o arquivo inteiro Processamento de arquivo Arquivos de acesso aleatorio Arquivos de acesso aleatorio Cont Figure 2 Visao do C de um arquivo de acesso aleatorio Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio A funcaomembro ostream write gera a saıda de um numero fixo de bytes comecando em uma localizacao especıfica da memoria para o fluxo especificado Quando o fluxo e associado com um arquivo a funcao write grava os dados na localizacao do arquivo especificada pelo ponteiro de posicao de arquivo put A funcaomembro istream read transfere um numero fixo de bytes a partir do fluxo especificado para uma area do inıcio da memoria em um endereco especificado Se o fluxo estiver associado com um arquivo a funcao read insere os bytes na localizacao do arquivo especificada pelo ponteiro de posicao de arquivo get Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont Gravando bytes com a funcaomembro ostream write outFilewrite reinterpret cast const char number sizeof number A funcao write trata seu primeiro argumento como um grupo de bytes visualizando o objeto na memoria como um const char que e um ponteiro para um byte lembrese de que um char e um byte Iniciando dessa localizacao a funcao write gera a saıda do numero de bytes especificados por seu segundo argumento um inteiro do tipo size t Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont2 Ex Programa de processamento de credito Criar um programa de processamento de credito capaz de armazenar no maximo 100 registros de largura fixa Cada registro deve consistir em um numero de conta que atua como a chave de registro um sobrenome um nome e um saldo O programa deve ser capaz de atualizar uma conta inserir uma nova conta excluir uma conta e inserir todos os registros de conta em um arquivo de texto formatado para impressao Esse programa inicializa todos os 100 registros do arquivo creditdat com objetos vazios utilizando a funcao write Cada objeto vazio contem 0 para o numero de conta a string nula representada por aspas vazias para o nome e o sobrenome e 00 para o saldo Cada registro e inicializado com a quantidade de espaco vazio em que os dados da conta serao armazenados Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont3 Definicao da classe ClientData Arquivo ClientDatah ifndef CLIENTDATA H define CLIENTDATA H include string using stdstring class ClientData public construtor ClientData padrao ClientData int 0 string string double 00 funcoes de acesso para accountNumber void setAccountNumber int int getAccountNumber const funcoes de acesso para lastName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont4 void setLastName string string getLastName const funcoes de acesso para firstName void setFirstName string string getFirstName const funcoes de acesso para balance void setBalance double double getBalance const private int accountNumber char lastName 15 objetos string nao tˆem tamanho uniforme char firstName 10 double balance fim da classe ClientData endif Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont5 Classe ClientData armazena informacoes de credito do cliente Arquivo ClientDatacpp include string using stdstring include ClientDatah construtor ClientData padrao ClientDataClientDataint accountNumberValue string lastNameValue string firstNameValue double balanceValue setAccountNumber accountNumberValue setLastName lastNameValue setFirstName firstNameValue setBalance balanceValue fim do construtor ClientData Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont6 obtem o valor do numero da conta int ClientDatagetAccountNumber const return accountNumber fim da funcao getAccountNumber configura o valor do numero da conta void ClientDatasetAccountNumber int accountNumberValue accountNumber accountNumberValue deve validar fim da funcao setAccountNumber obtem o valor do sobrenome string ClientDatagetLastName const return lastName fim da funcao getLastName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont7 configura o valor do sobrenome void ClientDatasetLastName string lastNameString copia no maximo 15 caracteres da string para lastName const char lastNameValue lastNameStringdata int length lastNameStringsize length length 15 length 14 strncpy lastName lastNameValue length lastName length 0 acrescenta caractere nulo fim da funcao setLastName string ClientDatagetFirstName const obtem o valor do nome return firstName fim da funcao getFirstName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont8 configura o valor do nome void ClientDatasetFirstName string firstNameString copia no maximo 10 caracteres da string para firstName const char firstNameValue firstNameStringdata int length firstNameStringsize length length 10 length 9 strncpy firstName firstNameValue length firstName length 0 acrescenta o caractere nulo fim da funcao setFirstName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont9 obtem o valor do saldo double ClientDatagetBalance const return balance fim da funcao getBalance configura o valor do saldo void ClientDatasetBalance double balanceValue balance balanceValue fim da funcao setBalance Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont10 Criando um arquivo de acesso aleatorio Arquivo Fig17 12cpp include iostream using stdcerr using stdendl using stdios include fstream using stdofstream include cstdlib using stdexit sai do prototipo da funcao include ClientDatah definicao da classe ClientData int main ofstream outCredit creditdat iosbinary Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont11 fecha o programa se ofstream nao pˆode abrir o arquivo if outCredit cerr File could not be opened endl exit 1 fim do if ClientData blankClient construtor gera a saıda de 100 registros em branco no arquivo for int i 0 i 100 i outCreditwrite reinterpret cast const char blankClient sizeof ClientData return 0 fim de main Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Exemplo de programa que lˆe o arquivo sequencialmente e imprime apenas aqueles registros que contˆem dados A funcao istream read insere um numero especificado de bytes da posicao atual no fluxo especificado em um objeto Observe que a funcao read requer um primeiro argumento do tipo char Visto que client e do tipo ClientData client deve sofrer coercao para char utilizando o operador de coercao reinterpret cast Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont Lendo um arquivo de acesso aleatorio sequencialmente Arquivo Fig17 14cpp include iostream using stdcerr using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint include iomanip using stdsetprecision using stdsetw include fstream Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont3 using stdifstream using stdostream include cstdlib using stdexit sai do prototipo de funcao include ClientDatah definicao da classe ClientData void outputLine ostream const ClientData prototipo int main ifstream inCredit creditdat iosin fecha o programa se ifstream nao puder abrir o arquivo if inCredit cerr File could not be opened endl exit 1 fim do if Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont4 cout left setw10 Account setw16 Last Name setw11 First Name left setw10 right Balance endl ClientData client cria registro lˆe o primeiro registro do arquivo inCreditread reinterpret cast char client sizeof ClientData lˆe todos os registros do arquivo while inCredit inCrediteof exibe o registro if clientgetAccountNumber 0 outputLine cout client Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont5 lˆe o proximo registro do arquivo inCreditread reinterpret cast char client sizeof ClientData fim do while return 0 fim de main exibe um unico registro void outputLine ostream output const ClientData record output left setw10 recordgetAccountNumber setw16 recordgetLastName setw11 recordgetFirstName setw10 setprecision2 right fixed showpoint recordgetBalance endl fim da funcao outputLine Processamento de arquivo Exercıcio Exercıcio 101 sem efeito Experimentando os exemplos fornecidos Execute os codigosfonte dos seguintes exemplos fornecidos nesta unidade e analise cuidadosamente os erros apontados pelo compilador e aponte a solucao em cada caso Arquivos de codigos que deverao ser implementados Fig17 12cpp Fig17 14cpp Processamento de arquivo Referˆencias Referˆencias HM Deitel PJ Deitel C como programar 5a ed Sao Paulo Pearson Prentice Hall 2006 IV Idoeta FG Capuano Elementos de Eletrˆonica Digital 6a ed Sao Paulo Erica 1984 Antonio Mendes da Silva Filho Introducao a programacao orientada a objetos com C Rio de Janeiro Elsevier 2010 httpswwwimeuspbr pfalgoritmosapendunicodehtml
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
33
Entradas e Saídas de Fluxo em C: Teorias e Técnicas
Linguagens de Programação
UFPA
11
Exercícios de Programação em C++: Consulta Médica, Conta Corrente e Marcação de Exame
Linguagens de Programação
UFPA
48
Tratamento de Exceções em Linguagens de Programação
Linguagens de Programação
UFPA
1
Ementa do Componente Curricular TE05270 - Técnicas e Linguagens de Programação
Linguagens de Programação
UFPA
1
Desenvolvendo uma Conta Corrente em C: Estruturação e Métodos
Linguagens de Programação
UFPA
1
Desenvolvimento de Aplicação com Bibliotecas em C++
Linguagens de Programação
UFPA
1
Atividade Prática: Criação de Circuito Lógico com Display de Sete Segmentos
Linguagens de Programação
UFPA
1
Algoritmo Peso Ideal - Classificacao por Peso em Pascal
Linguagens de Programação
UFPA
1
Anodo Comum: Princípios e Aplicações
Linguagens de Programação
UFPA
1
Programa em Pascal para Classificacao de Peso
Linguagens de Programação
UFPA
Texto de pré-visualização
Processamento de arquivo Tecnicas e Linguagens de Programacao Paulo Bentes UFPAITECFEEB June 8 2021 Processamento de arquivo Sumario Sumario 1 Introducao 2 Codigos 3 Variaveis de ambiente 4 Registro 5 Arquivos e fluxos 6 Criando um arquivo sequencial 7 Lendo dados de um arquivo sequencial 8 Problemas de atualizacao em arquivos de acesso sequencial 9 Arquivos de acesso aleatorio 10 Exercıcio 11 Referˆencias Processamento de arquivo Introducao Introducao Introducao O armazenamento de dados em variaveis arrays estruturas e objetos e realizado na memoria de acesso aleatorio RAM Random Access Memory e e temporario Os arquivos sao utilizados para persistˆencia de dados retencao permanente dos dados Os computadores armazenam arquivos em dispositivos de armazenamento secundarios como discos rıgidos HD Hard Disk discos opticos fitas e dispositivos de estado solido SSD Solid State Drive ou Flash Processamento de arquivo Codigos Codigos Codigo binario Computadores eletrˆonicos representam os codigos com apenas dois estados estaveis 0 e 1 que sao a representacao de condicoes fısicas tais como passar corrente e nao passar corrente ou mesmo dois nıveis de tensao eletrica A representacao de um estado e chamada de bit Numeros decimais na base 10 inteiros int ou fracionarios floatdouble podem ser representados por numeros binarios na base 2 Ex 2 bits podem representar ate 4 22 numeros decimais 0 3 0 00 1 01 2 10 3 11 Processamento de arquivo Codigos Codigos Cont Ex 5 bits podem representar ate 32 25 numeros decimais 0 31 0 00000 10 01010 20 10100 30 11110 1 00001 11 01011 21 10101 31 11111 2 00010 12 01100 22 10110 3 00011 13 01101 23 10111 4 00100 14 01110 24 11000 5 00101 15 01111 25 11001 6 00110 16 10000 26 11010 7 00111 17 10001 27 11011 8 01000 18 10010 28 11100 9 01001 19 10011 29 11101 Nota Para se conseguir representar 256 28 valores decimais 0 255 ou sımbolos serao necessarios 8 bits que formam um Byte Processamento de arquivo Codigos Codigos Cont 2 int Um inteiro em muitos compiladores sera representado por 2 Bytes 16 bits sendo 15 bits destinados a representacao do numero e 1 bit para representar o sinal entao a faixa de representacao sera de 32768 a 32767 unsigned int Inteiro sem sinal tambem representado por 2 Bytes sua faixa de representacao sera de 0 a 65535 Processamento de arquivo Codigos Codigos Cont 3 float Numero de ponto flutuante representado normalmente por 4 Bytes sua faixa sera de 34 E38 a 34 E38 double Numero de ponto flutuante representado normalmente por 8 Bytes sua faixa sera de 17 E308 a 17 E308 Nota As tecnicas de converao de decimal para binario ou o contrario para numero inteiros ou de ponto flutuante podem ser verificadas em Idoeta Capuano 1984 Processamento de arquivo Codigos Codigos Cont 4 char A representacao simbolica atraves do char e feita com apenas 1 Byte e permite expressar 256 caracteres O caractere vem a ser um sımbolo tipografico para escrever texto em alguma lıngua Pode incluir letras numeros ou qualquer outra expressao simbolica wchar t A representacao simbolica atraves do wchar t e feita com mais de 1 Byte e permite expressar o conjunto Unicode que atribui nomes numericos code points a mais de um milhao de caracteres Ex U0021 9 U0039 A U0041 a U0061 U0022 U002D B U0042 b U0062 Processamento de arquivo Codigos Codigos Cont 5 Codigo ASCII Os primeiros 128 caracteres da lista Unicode de U0000 a U007F sao os mais usados e e conhecido como alfabeto ASCII e necessita de apenas 1 Byte para representalos e podem ser representados por hexadecimal pois estao no inıcio da lista Unicode Ex 0x21 9 0x39 A 0x41 a 0x61 0x22 0x2D B 0x42 b 0x62 Codigo ISOLATIN1 Um Byte 8 bit e capaz de representar 256 caracteres e o codigo ISOLATIN1 faz exatamente isso No entanto esse codigo caiu em desuso Processamento de arquivo Codigos Codigos Cont 6 Codigo UTF8 O alfabeto Unicode tem mais de 1 milhao caracteres Portanto o codigo de cada caractere precisaria de pelo menos 3 Bytes perante a notacao binaria Usar um numero fixo de Bytes por caractere nao seria eficiente ja que 1 Byte e suficiente para codificar os caracteres mais comuns A solucao e recorrer a um codigo multibyte que emprega um numero variavel de Bytes por caractere alguns caracteres usam 1 Byte outros usam 2 Bytes e assim por diante Processamento de arquivo Exemplos de UTF8 Alguns exemplos da utilizagao dos cédigos em UTF8 U0021 0x21 00100001 U0022 0x22 00100010 9 U0039 0x39 00100111 U002D 0x2D 00101101 y U00FF OxC3BF 11000011 10111111 UCEA3 OxCEA3 11001110 10100011 U2014 0xE28094 11100010 10000000 10010100 U201C 0xE2809C 11100010 10000000 10011100 Processamento de arquivo Variaveis de ambiente Variaveis de ambiente Locales O comportamento de qualquer programa depende das variaveis de ambiente environment variables configurado no sistema operacional Essas variaveis especificam a lıngua e o esquema de codificacao padrao Digite locale no terminal de seu sistema operacional para obter o valor de todas as variaveis de ambiente Processamento de arquivo Variaveis de ambiente Variaveis de ambiente Cont locale LANGpt BRUTF8 LC CTYPEpt BRUTF8 LC NUMERIC pt BRUTF8 LC TIMEpt BRUTF8 LC COLLATE pt BRUTF8 LC MONETARYpt BRUTF8 LC MESSAGESpt BRUTF8 LC PAPERpt BRUTF8 LC NAMEpt BRUTF8 LC ADDRESSpt BRUTF8 LC TELEPHONEpt BRUTF8 LC MEASUREMENTpt BRUTF8 LC IDENTIFICATIONpt BRUTF8 LC ALL Processamento de arquivo Registro Registro Em geral um registro que pode ser representado como uma classe em C e um grupo de campos relacionados chamados membros de dados em C Em um sistema de folha de pagamento por exemplo um registro para um empregado particular poderia incluir os seguintes campos 1 Numero de identificacao do empregado 2 Nome 3 Endereco 4 Salariohora 5 Numero de isencoes reivindicadas 6 Lucros no ano ate a data atual 7 Total de impostos retidos Processamento de arquivo Arquivos e fluxos Arquivos Um arquivo e um grupo de registros relacionados Para facilitar a recuperacao de registros especıficos de um arquivo pelo menos um campo em cada registro e escolhido como uma chave de registro Uma chave de registro identifica um registro como pertencendo a uma pessoa ou entidade particular e distingue esse registro de todos os outros No registro de folha de pagamento descrito previamente o numero de identificacao de empregado normalmente seria escolhido como a chave de registro Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Arquivos e fluxos Quando um arquivo e aberto um objeto e criado e um fluxo e associado com o objeto Os objetos cin cout cerr e clog sao criados a partir da biblioteca iostream Os fluxos associados com esses objetos fornecem canais de comunicacao entre um programa e um arquivo ou dispositivo particular Por exemplo o objeto cin permite a um programa inserir dados a partir do teclado ou outros dispositivos o objeto cout permite a um programa gerar saıda de dados para a tela ou outros dispositivos e os objetos cerr e clog permitem a um programa gerar saıda de mensagens de erro para a tela ou outros dispositivos Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Cont Para realizar processamento de arquivo no C os arquivos de cabecalho iostream e fstream devem ser incluıdos O cabecalho fstream inclui as definicoes para os templates de classe de fluxo basic ifstream para entrada de arquivo basic ofstream para saıda de arquivo e basic fstream para entrada e saıda de arquivo Cada template de classe tem uma especializacao de template predefinida que permite a ES de char Processamento de arquivo Arquivos e fluxos Arquivos e fluxos Cont2 A biblioteca fstream fornece um conjunto de typedefs que fornecem aliases dessas especializacoes de template O typedef ifstream representa uma especializacao de basic ifstream que permite a entrada de char a partir de um arquivo De modo semelhante o typedef ofstream representa uma especializacao de basic ofstream que permite a saıda de char para arquivos Alem disso o typedef fstream representa uma especializacao de basic fstream que permite entrada de char a partir de arquivos e a saıda de char para arquivos Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial O C nao impoe nenhuma estrutura a um arquivo Assim um conceito como o de registro nao existe em um arquivo C No exemplo a seguir vemos como o programador impoe uma estrutura simples de registro a um arquivo Figure 1 A visao do C de um arquivo de n bytes Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont Combinacoes de tecla de fim de arquivo UNIXLinuxMac OS X ctrld em uma linha isolada Microsoft Windows ctrlz as vezes seguido pela tecla Enter VAX VMS ctrlz Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont2 Usamos o conceito de registro para criar um arquivo sequencial simples que poderia ser utilizado em um sistema de contas a receber para ajudar a gerenciar o dinheiro devido por clientes de uma empresa Para cada cliente o programa obtem o numero da conta do cliente nome e saldo O numero da conta serve como a chave de registro nesse aplicativo isto e o programa cria e mantem o arquivo na ordem de numeros de conta Esse programa assume que o usuario insere os registros na ordem de numeros de conta Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont3 Arquivos sao abertos criando os objetos ifstream ofstream ou fstream No exemplo o arquivo deve ser aberto para saıda portanto um objeto ofstream e criado Dois argumentos sao passados para o construtor do objeto o nome de arquivo e o modo fileopen Para um objeto ofstream o modo fileopen pode ser iosout para gerar saıda de dados em um arquivo ou iosapp para acrescentar dados ao fim de um arquivo sem modificar quaisquer dados ja presentes no arquivo Arquivos existentes abertos com o modo iosout sao truncados todos os dados no arquivo sao descartados Se o arquivo especificado ainda nao existir entao ofstream cria o arquivo utilizando esse nome de arquivo Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont4 Ex Cria um arquivo sequencial Arquivo Fig17 04cpp include iostream using stdcerr using stdcin using stdcout using stdendl using stdios include fstream fluxo de arquivo using stdofstream gera a saıda do fluxo do arquivo include cstdlib using stdexit sai do prototipo de funcao Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont5 int main construtor ofstream abre arquivo ofstream outClientFile clientsdat iosout fecha o programa se nao conseguir criar arquivo if outClientFile operador sobrecarregado cerr File could not be opened endl exit 1 argumento nao zero indicando termino anormal fim do if cout Enter the account name and balance endl Enter end of file to end input int account char name 30 double balance Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont6 lˆe conta nome e saldo a partir de cin entao coloca no arquivo while cin account name balance outClientFile account name balance endl cout fim do while return 0 destrutor ofstream fecha o arquivo fim de main Nota Por padrao os objetos ofstream sao abertos para saıda entao o codigo poderia ter executado a instrucao ofstream outClientFile clientsdat Processamento de arquivo Criando um arquivo sequencial Criando um arquivo sequencial Cont7 Enter the account name and balance Enter endoffile to end input 100 Jones 2498 200 Doe 34567 300 White 000 400 Stone 4216 500 Rich 22462 ˆ Z Uma vez que o usuario insere o indicador de fim do arquivo main termina Isso invoca a funcao destrutora do objeto outClientFile implicitamente o que fecha o arquivo clientsdat O programador tambem pode fechar o objeto ofstream explicitamente utilizando a funcaomembro close na instrucao outClientFileclose Processamento de arquivo Criando um arquivo sequencial Modos de fileopen Modos de fileopen iosapp Acrescenta toda saıda ao fim do arquivo iosate Abre um arquivo para saıda e movese para o fim do arquivo normalmente utilizado para acrescentar dados a um arquivo Os dados podem ser gravados em qualquer lugar do arquivo iosin Abre um arquivo para a entrada iosout Abre um arquivo para a saıda iostrunc Descarta o conteudo do arquivo se ele existir essa tambem e a acaopadrao de iosout iosbinary Abre um arquivo para entrada ou saıda binaria isto e naotexto Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Os arquivos armazenam dados de modo que eles possam ser recuperados para processamento quando necessario O proximo exemplo lˆe os registros do arquivo clientsdat que criamos e exibe o conteudo desses registros Criar um objeto ifstream abre um arquivo para entrada O construtor ifstream pode receber o nome do arquivo e o modo de abertura do arquivo como argumentos O codigo cria um objeto ifstream chamado inClientFile e o associa com o arquivo clientsdat Os argumentos entre parˆenteses sao passados para a funcao construtora ifstream que abre o arquivo e estabelece uma linha de comunicacao com o arquivo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont2 Ex Lendo e imprimindo um arquivo sequencial Arquivo Fig17 07cpp include iostream using stdcerr using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint include fstream fluxo de arquivo using stdifstream insere fluxo de arquivo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont3 include iomanip using stdsetw using stdsetprecision include string using stdstring include cstdlib using stdexit sai do prototipo de funcao void outputLine int const string double prototipo int main construtor ifstream abre o arquivo ifstream inClientFile clientsdat iosin Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont4 fecha o programa se ifstream nao pˆode abrir o arquivo if inClientFile cerr File could not be opened endl exit 1 fim do if int account char name 30 double balance cout left setw10 Account setw13 Name Balance endl fixed showpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont5 exibe cada registro no arquivo while inClientFile account name balance outputLine account name balance return 0 destrutor ifstream fecha o arquivo fim de main exibe um registro do arquivo void outputLine int account const string name double balance cout left setw10 account setw13 name setw7 setprecision2 right balance endl fim da funcao outputLine Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont6 Lendo a partir do inıcio do arquivo Nos exemplos anteriores os programas comecam a ler a partir do inıcio do arquivo e lˆeem todos os dados consecutivamente ate que os dados desejados sejam encontrados Lendo a partir de outras posicoes do arquivo Tanto istream como ostream fornecem funcoesmembro para reposicionar o ponteiro de posicao do arquivo o numero de bytes ate o proximo byte no arquivo a ser lido ou gravado Essas funcoesmembro sao seekg seek get para istream que indica o numero de bytes no arquivo a partir do qual a proxima entrada deve ocorrer e seekp seek put para ostream que indica o numero de bytes no arquivo em que a proxima saıda deve ser colocada Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont7 O argumento para seekg ou seekp normalmente e um inteiro long Um segundo argumento pode ser especificado para indicar a direcao de busca seek direction A direcao de busca pode ser iosbeg o padrao para o posicionamento em relacao ao inıcio de um fluxo ioscur para posicionamento em relacao a posicao atual de um fluxo ou iosend para posicionamento em relacao ao fim de um fluxo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont8 Posicao para o enesimo byte de fileObject supoe iosbeg fileObjectseekg n Posiciona n bytes para a frente em fileObject fileObjectseekg n ioscur Posiciona n bytes para tras a partir do fim de fileObject fileObjectseekg n iosend Posiciona no fim de fileObject fileObjectseekg 0 iosend Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont9 Ex Programa de consulta de credito Arquivo Fig17 08cpp include iostream using stdcerr using stdcin using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont10 include fstream using stdifstream include iomanip using stdsetw using stdsetprecision include string using stdstring include cstdlib using stdexit sai do prototipo de funcao enum RequestType ZERO BALANCE 1 CREDIT BALANCE DEBIT BALANCE END int getRequest bool shouldDisplay int double void outputLine int const string double Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont11 int main construtor ifstream abre o arquivo ifstream inClientFile clientsdat iosin fecha o programa se ifstream nao pˆode abrir o arquivo if inClientFile cerr File could not be opened endl exit 1 fim do if int request int account char name 30 double balance obtem a solicitacao do usuario saldo zero credor ou devedor Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont12 request getRequest processa solicitacao do usuario while request END switch request case ZERO BALANCE cout Accounts with zero balances break case CREDIT BALANCE cout Accounts with credit balances break case DEBIT BALANCE cout Accounts with debit balances break fim do switch Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont13 lˆe a conta nome e saldo do arquivo inClientFile account name balance exibe conteudo do arquivo ate eof while inClientFileeof exibe o registro if shouldDisplay request balance outputLine account name balance lˆe a conta o nome e o saldo do arquivo inClientFile account name balance fim do while interno inClientFileclear redefine eof para proxima entrada inClientFileseekg 0 reposiciona no comeco de arquivo request getRequest obtem solicitacao adicional do usuario fim do while externo Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont14 cout End of run endl return 0 destrutor ifstream fecha o arquivo fim de main obtem a solicitacao do usuario int getRequest int request solicitacao do usuario exibe opcoes de solicitacao cout Enter request endl 1 List accounts with zero balances endl 2 List accounts with credit balances endl 3 List accounts with debit balances endl 4 End of run fixed showpoint Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont15 do entrada da solicitacao do usuario cout cin request while request ZERO BALANCE request END return request fim da funcao getRequest determina se exibe um dado registro bool shouldDisplay int type double balance determina se exibe saldos zero if type ZERO BALANCE balance 0 return true Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont16 determina se exibe saldos credores if type CREDIT BALANCE balance 0 return true determina se exibe saldos devedores if type DEBIT BALANCE balance 0 return true return false caso em que todos os ifs falham fim da funcao shouldDisplay exibe um registro do arquivo void outputLine int account const string name double balance cout left setw10 account setw13 name setw7 setprecision2 right balance endl fim da funcao outputLine Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont17 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 1 Accounts with zero balances 300 White 000 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont18 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 2 Accounts with credit balances 400 Stone 4216 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont19 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 3 Accounts with debit balances 100 Jones 2498 200 Doe 34567 500 Rich 22462 Processamento de arquivo Lendo dados de um arquivo sequencial Lendo dados de um arquivo sequencial Cont20 Enter request 1 List accounts with zero balances 2 List accounts with credit balances 3 List accounts with debit balances 4 End of run 4 End of run Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Os arquivos sequenciais sao inadequados aos aplicativos de acesso instantˆaneo em que um registro particular deve ser imediatamente localizado Aplicativos de acesso instantˆaneo comuns sao sistemas de reserva de passagem aerea sistemas bancarios sistemas de pontodevenda caixas automaticos e outros tipos de sistemas de processamento de transacao que requerem acesso rapido a dados especıficos Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Cont Os dados formatados e gravados em um arquivo sequencial nao podem ser modificados sem o risco de destruir outros dados no arquivo Por exemplo se o nome White precisa ser mudado para Worthington o antigo nao pode ser sobrescrito sem corromper o arquivo O registro para White foi gravado no arquivo como 300 White 000 Se esse registro fosse regravado comecando na mesma localizacao do arquivo utilizando o nome mais longo o registro seria 300 Worthington 000 O novo registro contem seis caracteres a mais que o registro original Portanto os caracteres alem do segundo o em Worthington sobrescreveriam o inıcio do proximo registro sequencial no arquivo Processamento de arquivo Problemas de atualizacao em arquivos de acesso sequencial Problemas de atualizacao em arquivos de acesso sequencial Cont2 O problema e que no modelo de entradasaıda formatada utilizando o operador de insercao de fluxo e o operador de extracao de fluxo os campos e portanto os registros podem variar de tamanho Por exemplo os valores 7 14 117 2074 e 27383 sao todos int que armazenam o mesmo numero de bytes de dados brutos internamente em geral quatro bytes nas atuais maquinas de 32 bits populares Entretanto esses inteiros tornamse campos de diferentes tamanhos quando sua saıda e gerada como texto formatado sequˆencias de caractere Portanto o modelo de entradasaıda formatada normalmente nao e utilizado para atualizar registros no local Processamento de arquivo Arquivos de acesso aleatorio Arquivos de acesso aleatorio Um banco pode ter centenas de milhares ou ate milhoes de outros clientes e ainda assim quando um cliente utiliza um caixa automatico o programa verifica a conta desse cliente em alguns segundos ou menos para saber se ha fundos suficientes Esse tipo de acesso instantˆaneo e possıvel com arquivos de acesso aleatorio Os registros individuais de um arquivo de acesso aleatorio podem ser acessados diretamentee rapidamente sem preciser pesquisar outros registros Os dados podem ser inseridos em um arquivo de acesso aleatorio sem destruir outros dados no arquivo Os dados previamente armazenados tambem podem ser atualizados ou excluıdos sem regravar o arquivo inteiro Processamento de arquivo Arquivos de acesso aleatorio Arquivos de acesso aleatorio Cont Figure 2 Visao do C de um arquivo de acesso aleatorio Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio A funcaomembro ostream write gera a saıda de um numero fixo de bytes comecando em uma localizacao especıfica da memoria para o fluxo especificado Quando o fluxo e associado com um arquivo a funcao write grava os dados na localizacao do arquivo especificada pelo ponteiro de posicao de arquivo put A funcaomembro istream read transfere um numero fixo de bytes a partir do fluxo especificado para uma area do inıcio da memoria em um endereco especificado Se o fluxo estiver associado com um arquivo a funcao read insere os bytes na localizacao do arquivo especificada pelo ponteiro de posicao de arquivo get Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont Gravando bytes com a funcaomembro ostream write outFilewrite reinterpret cast const char number sizeof number A funcao write trata seu primeiro argumento como um grupo de bytes visualizando o objeto na memoria como um const char que e um ponteiro para um byte lembrese de que um char e um byte Iniciando dessa localizacao a funcao write gera a saıda do numero de bytes especificados por seu segundo argumento um inteiro do tipo size t Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont2 Ex Programa de processamento de credito Criar um programa de processamento de credito capaz de armazenar no maximo 100 registros de largura fixa Cada registro deve consistir em um numero de conta que atua como a chave de registro um sobrenome um nome e um saldo O programa deve ser capaz de atualizar uma conta inserir uma nova conta excluir uma conta e inserir todos os registros de conta em um arquivo de texto formatado para impressao Esse programa inicializa todos os 100 registros do arquivo creditdat com objetos vazios utilizando a funcao write Cada objeto vazio contem 0 para o numero de conta a string nula representada por aspas vazias para o nome e o sobrenome e 00 para o saldo Cada registro e inicializado com a quantidade de espaco vazio em que os dados da conta serao armazenados Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont3 Definicao da classe ClientData Arquivo ClientDatah ifndef CLIENTDATA H define CLIENTDATA H include string using stdstring class ClientData public construtor ClientData padrao ClientData int 0 string string double 00 funcoes de acesso para accountNumber void setAccountNumber int int getAccountNumber const funcoes de acesso para lastName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont4 void setLastName string string getLastName const funcoes de acesso para firstName void setFirstName string string getFirstName const funcoes de acesso para balance void setBalance double double getBalance const private int accountNumber char lastName 15 objetos string nao tˆem tamanho uniforme char firstName 10 double balance fim da classe ClientData endif Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont5 Classe ClientData armazena informacoes de credito do cliente Arquivo ClientDatacpp include string using stdstring include ClientDatah construtor ClientData padrao ClientDataClientDataint accountNumberValue string lastNameValue string firstNameValue double balanceValue setAccountNumber accountNumberValue setLastName lastNameValue setFirstName firstNameValue setBalance balanceValue fim do construtor ClientData Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont6 obtem o valor do numero da conta int ClientDatagetAccountNumber const return accountNumber fim da funcao getAccountNumber configura o valor do numero da conta void ClientDatasetAccountNumber int accountNumberValue accountNumber accountNumberValue deve validar fim da funcao setAccountNumber obtem o valor do sobrenome string ClientDatagetLastName const return lastName fim da funcao getLastName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont7 configura o valor do sobrenome void ClientDatasetLastName string lastNameString copia no maximo 15 caracteres da string para lastName const char lastNameValue lastNameStringdata int length lastNameStringsize length length 15 length 14 strncpy lastName lastNameValue length lastName length 0 acrescenta caractere nulo fim da funcao setLastName string ClientDatagetFirstName const obtem o valor do nome return firstName fim da funcao getFirstName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont8 configura o valor do nome void ClientDatasetFirstName string firstNameString copia no maximo 10 caracteres da string para firstName const char firstNameValue firstNameStringdata int length firstNameStringsize length length 10 length 9 strncpy firstName firstNameValue length firstName length 0 acrescenta o caractere nulo fim da funcao setFirstName Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont9 obtem o valor do saldo double ClientDatagetBalance const return balance fim da funcao getBalance configura o valor do saldo void ClientDatasetBalance double balanceValue balance balanceValue fim da funcao setBalance Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont10 Criando um arquivo de acesso aleatorio Arquivo Fig17 12cpp include iostream using stdcerr using stdendl using stdios include fstream using stdofstream include cstdlib using stdexit sai do prototipo da funcao include ClientDatah definicao da classe ClientData int main ofstream outCredit creditdat iosbinary Processamento de arquivo Arquivos de acesso aleatorio Criando um arquivos de acesso aleatorio Cont11 fecha o programa se ofstream nao pˆode abrir o arquivo if outCredit cerr File could not be opened endl exit 1 fim do if ClientData blankClient construtor gera a saıda de 100 registros em branco no arquivo for int i 0 i 100 i outCreditwrite reinterpret cast const char blankClient sizeof ClientData return 0 fim de main Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Exemplo de programa que lˆe o arquivo sequencialmente e imprime apenas aqueles registros que contˆem dados A funcao istream read insere um numero especificado de bytes da posicao atual no fluxo especificado em um objeto Observe que a funcao read requer um primeiro argumento do tipo char Visto que client e do tipo ClientData client deve sofrer coercao para char utilizando o operador de coercao reinterpret cast Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont Lendo um arquivo de acesso aleatorio sequencialmente Arquivo Fig17 14cpp include iostream using stdcerr using stdcout using stdendl using stdfixed using stdios using stdleft using stdright using stdshowpoint include iomanip using stdsetprecision using stdsetw include fstream Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont3 using stdifstream using stdostream include cstdlib using stdexit sai do prototipo de funcao include ClientDatah definicao da classe ClientData void outputLine ostream const ClientData prototipo int main ifstream inCredit creditdat iosin fecha o programa se ifstream nao puder abrir o arquivo if inCredit cerr File could not be opened endl exit 1 fim do if Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont4 cout left setw10 Account setw16 Last Name setw11 First Name left setw10 right Balance endl ClientData client cria registro lˆe o primeiro registro do arquivo inCreditread reinterpret cast char client sizeof ClientData lˆe todos os registros do arquivo while inCredit inCrediteof exibe o registro if clientgetAccountNumber 0 outputLine cout client Processamento de arquivo Arquivos de acesso aleatorio Lendo um arquivo de acesso aleatorio Cont5 lˆe o proximo registro do arquivo inCreditread reinterpret cast char client sizeof ClientData fim do while return 0 fim de main exibe um unico registro void outputLine ostream output const ClientData record output left setw10 recordgetAccountNumber setw16 recordgetLastName setw11 recordgetFirstName setw10 setprecision2 right fixed showpoint recordgetBalance endl fim da funcao outputLine Processamento de arquivo Exercıcio Exercıcio 101 sem efeito Experimentando os exemplos fornecidos Execute os codigosfonte dos seguintes exemplos fornecidos nesta unidade e analise cuidadosamente os erros apontados pelo compilador e aponte a solucao em cada caso Arquivos de codigos que deverao ser implementados Fig17 12cpp Fig17 14cpp Processamento de arquivo Referˆencias Referˆencias HM Deitel PJ Deitel C como programar 5a ed Sao Paulo Pearson Prentice Hall 2006 IV Idoeta FG Capuano Elementos de Eletrˆonica Digital 6a ed Sao Paulo Erica 1984 Antonio Mendes da Silva Filho Introducao a programacao orientada a objetos com C Rio de Janeiro Elsevier 2010 httpswwwimeuspbr pfalgoritmosapendunicodehtml