Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introduc¸a˜o a` Organizac¸a˜o de Arquivos: Aula 7 Departamento de Cieˆncia da Computac¸a˜o Instituto de Cieˆncias Exatas Universidade de Bras´ılia 1 / 53 Suma´rio Conceitos Ba´sicos sobre Estrutura de Arquivos 1 Arquivo Stream 2 Organizac¸a˜o por Campos 3 Organizac¸a˜o por Registros 4 Acesso a Registros 5 Acesso a Arquivos 6 Metadados 7 Portabilidade e Padronizac¸a˜o 2 / 53 Arquivos Stream Arquivos Stream E´ um arquivo de fluxo (sequeˆncia) de caracteres na˜o ha´ nenhuma estrutura envolvendo tais caracteres. portanto na˜o existem campos ou registros! e´ meramente um fluxo de bytes. a unidade ba´sica significante e´ o caractere. na˜o ha´ separadores de linhas e nem registros. Uma vez que as informac¸o˜es foram escritas, na˜o existe como recuperar porc¸o˜es individuais (nome, cidade, CEP, etc). Exemplo Input: John Ames Alan Mason 123 Maple 90 Eastgate Stillwater, OK 74075 Ada, OK 74820 Output: AmesJohn123MapleStillwaterOK74075MasonAlan90EastgateAdaOK74820 3 / 53 Arquivos Stream A escrita e´ feita sem qualquer separac¸a˜o dos campos: (a) Uma vez que as informac¸o˜es foram escritas, na˜o existe como recuperar as porc¸o˜es individuais, perdendo assim a integridade das unidades fundamentais de organizac¸a˜o dos dados de entrada. (b) Os dados eram agregac¸o˜es de caracteres com significado pro´prio, denominado campos, que e´ a menor unidade lo´gica de informac¸a˜o em um arquivo. Esses campos na˜o foram delimitados no arquivo. (Perdemos os campos que estruturam logicamente a informac¸a˜o em nomes e enderec¸os) Um arquivo Stream e´ adequado para armazenar informac¸o˜es tais como: A foto de um cliente, que e´ composta de uma string cont´ınua de bits representando variac¸o˜es de cor. texto de um documento, imagens, a´udio, video, e documentos HTML. Observac¸a˜o Campo e´ uma noc¸a˜o lo´gica, uma ferramenta conceitual, que na˜o corresponde necessariamente a um conceito f´ısico. 4 / 53 Arquivos Stream Figura: Arquivos Stream Vs Arquivos orientados a` campos 5 / 53 Arquivos Stream 6 / 53 Arquivos Orientados a` Campos Arquivos orientados a` campos Ha´ muitos meios de estruturar arquivos por campos: 1 Definir campos de tamanhos fixos 2 Iniciar cada campo com um indicador de tamanho 3 Colocar delimitador no fim de cada campo Separando o campo do pro´ximo. 4 Usar uma expressa˜o “atributo = valor” para identificar cada campo e seu conteu´do. Esse seria um arquivo de atributos (keywords) e valores dos atributos. 7 / 53 Arquivos Orientados a` Campos Me´todo 1: Campos com comprimento fixo 87358CARROLL ALICE IN WONDERLAND 03818FOLK FILE STRUCTURES 79733KNUTH THE ART OF COMPUTER PROG Aumento do tamanho do arquivo: aloca mais espac¸o do que o requerido para armazenar valores menores do que o tamanho de cada campo. Perda da qualidade da informac¸a˜o: pelo limite imposto, muitos valores de campos ficam truncados (por exemplo, nomes ou enderec¸os). Indicado apenas se o comprimento dos valores a armazenar for fixo ou com pouca variac¸a˜o! Facilita a implementac¸a˜o e a recuperac¸a˜o dos registros. O arquivo pode ser lido ou gravado com o uso de arrays heterogeˆneos. 8 / 53 Arquivos Orientados a` Campos Me´todo 2: campos precedidos de um indicador de tamanho O tamanho de cada campo e´ armazenado imediatamente antes do dado do campo. Tamanho zero indica campo ausente. Muito utilizado para representar strings de tamanho varia´vel. 058735807CARROLL19ALICE IN WONDERLAND 050381804FOLK15FILE STRUCTURES 9 / 53 Arquivos Orientados a` Campos Me´todo 3: campos separados por delimitadores Preserva identidade de cada campo separando-os por delimitadores. Escolhe-se algum caracter especial ou sequeˆncia de caracteres que na˜o podem aparecer como valores dos campos e usa como delimitador. O caractere escolhido na˜o pode ser incluso como um elemento va´lido de algum campo. Utilizar uma barra vertical, por exemplo. 8735807|CARROLL|ALICE IN WONDERLAND 03818|FOLK|FILE STRUCTURES 10 / 53 Arquivos Orientados a` Campos Me´todo 4: uso de uma expressa˜o do tipo “atributo = valor” para identificar os campos O campo fornece informac¸a˜o sobre si pro´prio (metadado) Fa´cil identificar o conteu´do do arquivo. E´ um bom formato para lidar com campos ausentes (O atributo simplesmente esta´ ausente). Deve-se usar delimitadores (me´todo 3) Para separar o valor anterior do atributo do pro´ximo campo. Funciona como uma lista de Atributos (keywords). As keywords podem ocupar uma porc¸a˜o significativa do arquivo. ISBN=8735807|AU=CARROLL|TI=ALICE IN WONDERLAND ISBN=03818|AU=FOLK|TI=FILE STRUCTURES 11 / 53 Exerc´ıcio Exerc´ıcio Fac¸a um programa que leia os dados sobrenome, nome, enderec¸o, CEP e telefone do teclado e grave esses dados segundo os me´todos abaixo. Esse programa deve ser capaz de listar os registros apo´s grava´-los. 1 Campos de tamanho fixo 2 Campos com tamanho no in´ıcio 3 Campos com separadores 4 Campos com atributo = valor Leia e grave ate´ que sobrenome = “ ”. Obs: O me´todo de organizac¸a˜o do arquivo deve ser passado via linha de comando. 12 / 53 Organizac¸a˜o de Arquivos por Registros Registro Registro e´ um conjunto de campos (de tipos quaisquer) que devem estar agrupados quando o arquivo e´ analisado em um n´ıvel de organizac¸a˜o mais alto. Registro e´ uma ferramenta conceitual, como o conceito de campo. E´ um outro n´ıvel de organizac¸a˜o que se impo˜e aos dados para preservar seu significado. Os registros na˜o precisam ser entidades f´ısicas de um arquivo. Mesmo que eles sejam noc¸o˜es lo´gicas relevantes inclusas na estrutura do arquivo. podem coexistir com entidades f´ısicas como: setores (trilhas organizadas por setores), clusters, extents etc. blocos (trilhas organizadas por blocos, pa´ginas, etc. . . ) 13 / 53 Organizac¸a˜o de Arquivos por Registros Os me´todos de organizac¸a˜o por registro mais frequ¨entes sa˜o 1 Registros de tamanho fixo 2 Registros com um nu´mero fixo de campos 3 Registros com tamanho indicado no in´ıcio 4 Registros apontados por ı´ndices 5 Registros com delimitadores 14 / 53 Organizac¸a˜o de Arquivos por Registros Me´todo 1: Registros de tamanho fixo Registro de tamanho fixo com campos de tamanho fixo. A soma do tamanho dos campos e do tamanho dos elementos de controle para sua separac¸a˜o, tem como limite o tamanho fixado pelo registro. Por exemplo: Registro de tamanho 62B com o conjunto de campos: nome — 20B, enderec¸o — 20B, cidade — 20B, UF — 2B. Se o registro ocupa, por exemplo, 32B, enta˜o o tamanho efetivo sera´ 62B. Se desempenho e´ muito importante, pode-se tentar ajustar o tamanho para se adaptar melhor a organizac¸a˜o do disco. Por exemplo, se o tamanho do setor e´ de 512B, enta˜o, definir os registros com 64B evita a quebra de registros entre setores (8 reg/setor). 87358CARROLL ALICE IN WONDERLAND 03818FOLK FILE STRUCTURES 79733KNUTH THE ART OF COMPUTER PROG 15 / 53 Organizac¸a˜o de Arquivos por Registros Me´todo 1: Registros de tamanho fixo Registros de tamanho fixo com tamanho de campo varia´vel. Com indicadores do tamanho dos campos 058735807CARROLL19ALICE IN WONDERLAND 050381804FOLK15FILE STRUCTURES Com delimitadores de campo 8735807|CARROLL|ALICE IN WONDERLAND 03818|FOLK|FILE STRUCTURES Observac¸a˜o A selec¸a˜o do tamanho do registro e´ mais dif´ıcil quando os comprimentos dos campos podem variar. A escolha de um comprimento fazendo a soma do tamanho ma´ximo estimado para cada campo garante espac¸o suficiente, mas e´ desperdic¸ado um espac¸o enorme. 16 / 53 Organizac¸a˜o de Arquivos por Registros Registros com um Nu´mero Fixo de Campos Quantidade fixada de campos Ao inve´s de especificar quecada registro conte´m um nu´mero fixo de bytes (tamanho), podemos especificar que conte´m um nu´mero fixo de campos! (o tamanho do registro, em bytes, e´ varia´vel) Cada campo pode ter tamanho varia´vel ou fixo. Os campos seriam separados por delimitadores! Tamanho do Registro Na˜o e´ limitado. E´ o somato´rio dos tamanhos dos campos. Tamanho fixo ou varia´vel. Depende dos tamanhos dos campos. 17 / 53 Organizac¸a˜o de Arquivos por Registros Exemplo Com delimitadores de campos: 8735807|CARROLL|ALICE IN WONDERLAND|03818. . . Com indicadores de tamanho no in´ıcio dos campos: 058735807CARROLL19ALICE IN WONDERLAND0503818. . . Calculando o nu´mero do registro Como o programa sabe o ı´nicio do registro n? (n− 1) ·m+ 1 Onde m e´ o nu´mero de campos por registro. 18 / 53 Organizac¸a˜o de Arquivos por Registros Me´todo 3: Registros com Tamanho Indicado no In´ıcio O registro comec¸a com o seu tamanho Me´todo frequ¨entemente empregado para tratar registros de tamanho varia´vel. Precisa conhecer o tamanho dos campos. Tamanho do registro (em bytes) e´ a soma dos tamanhos dos campos com: A quantidade de delimitadores dos campos Ou a quantidade de bytes dos indicadores dos tamanhos dos campos. Exemplo com delimitadores dos campos: 338735807|CARROLL|ALICE IN WONDERLAND 2603818|FOLK|FILE STRUCTURES 19 / 53 Organizac¸a˜o de Arquivos por Registros Me´todo 4:Registros Apontados por I´ndices Os registros sa˜o mantidos em um arquivo: Um arquivo adicional de ı´ndices aponta para os registros no arquivo de dados. Cada ı´ndice mante´m o enderec¸o de deslocamento relativo (offset) para cada registro no arquivo original. A diferenc¸a dos enderec¸os entre ı´ndices consecutivos representa o tamanho do registro. Os registros no arquivo de dados e seus enderec¸os no arquivo de ı´ndices sa˜o consecutivos e correspondentes. Seguem a mesma ordem. Os campos sa˜o separados por delimitadores. 20 / 53 Organizac¸a˜o de Arquivos por Registros Me´todo 5: Registros com Delimitadores Os registros no arquivo texto sa˜o separados por um delimitador: O delimitador na˜o pode ocorrer como conteu´do de um campo armazenado. tal delimitador pode ser um caracter de final de linha: “CR-LF”, usado em processamento de textos. CR (Carriage return) seguido por um LF (line feed) E´ a mesma ideia usada na delimitac¸a˜o de campos. O delimitador de campos e´ mantido, sendo que o me´todo combina os dois delimitadores. Por exemplo: 21 / 53 Revisa˜o Revisa˜o Ate´ aqui, em todas essas formas de organizar arquivos, por campo ou por registro, estamos falando de: Arquivo do tipo texto fluxo de bytes (arquivo stream). 22 / 53 Organizac¸a˜o de Arquivos por Registros Organizac¸a˜o de Arquivos por Registros Uma estrutura de dados focada em registros pressupo˜e: O registro e´ a unidade de informac¸a˜o. Essa unidade lo´gica e´ lida ou gravada. Ser poss´ıvel recuperar um registro espec´ıfico, sem precisar ler o arquivo completo. Uma chave para identificar um registro. Chave Chave e´ uma ferramenta conceitual. Bem como os conceitos de campo e registro vistos anteriormente. 23 / 53 Organizac¸a˜o de Arquivos por Registros Chave Uma chave deve ter uma forma padra˜o Ha´ regras para mapear campos do registro em chaves na forma padra˜o. Uma chave na forma padra˜o e´ dita chave canoˆnica. O ideal e´ que exista uma relac¸a˜o um a um entre chave e registro, ou seja cada chave corresponde um u´nico registro. Exemplo Se a regra define chaves com letras maiu´sculas, qualquer entrada dada pelo usua´rio e´ convertida para a forma canoˆnica antes da pesquisa (e deve estar gravada no arquivo dessa forma). 24 / 53 Organizac¸a˜o de Arquivos por Registros Exemplo: Chave canoˆnica Um arquivo e´ composto de registros com dados de empregados de uma empresa. Um arquivo e´ composto de registros com dados de empregados de uma empresa. Uma chave pode ser o sobrenome do empregado: silva, SILVA, Silva, etc. Logo antes de fazer a procura devemos transformar a chave a forma padra˜o. Uma chave pode ser formada por conjunto de campos e na˜o necessariamente por um campo especifico: SILVA JOA˜O. Para a correta identificac¸a˜o durante a procura deve existir uma regra para misturar os registros na criac¸a˜o das chaves. 25 / 53 Organizac¸a˜o de Arquivos por Registros Chave Prima´ria Identifica unicamente cada registro Em geral, na˜o pode ser modificada. Exemplo: matr´ıcula, nome, CPF, . . . Chave Secunda´ria Chave que pode ser compartilhada por dois ou mais registros Na˜o ha´ garantias de unicidade. Exemplo: nome, cidade, UF, . . . Pode ser utilizada para buscas simultaˆneas de va´rias chaves (todos os “Silva” que moram em Curitiba, por exemplo). 26 / 53 Acesso a Registros Busca Sequencial Consiste em fazer uma busca sequencial no arquivo. Selecionando os registros com chave igual a chave-de-busca (registros pretendidos). Se a chave-de-busca e´ prima´ria apenas um registro sera´ selecionado. Desempenho da Busca Sequencial Instaˆncia Nu´mero de Leituras Crescimento Assinto´tico Melhor Caso 1 leitura Θ(1) Pior caso n leituras Θ(n) Caso me´dio n 2 leituras Θ(n) 27 / 53 Acesso a Registros Figura: Estrate´gia: Busca sequencial com blocagem 28 / 53 Acesso a Registros Busca Sequencial com Blocagem Melhora o desempenho substancialmente: a blocagem economiza tempo Reduz o nu´mero de operac¸o˜es de seek Na˜o muda o crescimento assinto´tico (Θ(n)) Reflete as diferenc¸as entre velocidades: Velocidade RAM >> Velocidade Disco Na˜o muda o nu´mero de comparac¸o˜es em RAM. Pode aumentar a quantidade de transfereˆncias entre disco e RAM: Sempre sera´ lido o bloco todo, mesmo se o registro procurado e´ o primeiro do bloco! 29 / 53 Acesso a Arquivos Vantagens da Busca Sequencial Fa´cil de programar. Requer estruturas de arquivos simples. Busca Sequencial e´ Razoa´vel para Algumas Aplicac¸o˜es Para algumas aplicac¸o˜es, a busca sequencial e´ razoa´vel para resoluc¸a˜o de problemas: Na busca por uma cadeia em um arquivo ASCII (como faz, por exemplo: utilita´rio grep do UNIX). Em arquivos com poucos registros. Em arquivos pouco pesquisados (por exemplo, mantidos em fita). Na busca por registros com um certo valor de chave secunda´ria, para a qual se espera muitos registros (muitas ocorreˆncias). 30 / 53 Acesso a Arquivos Acesso Direto Alternativa ao me´todo sequencial quando queremos recuperar um registro em espec´ıfico. Suponha que este seja o k-e´simo registro: A leitura na˜o passa pelos k − 1 registros anteriores. Na˜o importa o tamanho do arquivo, o esforc¸o de busca sera´ sempre constante de Θ(1) se o dispositivo tiver a capacidade de acesso direto. E´ necessa´rio conhecer a posic¸a˜o relativa do registro (PRR) na sequeˆncia de registros do arquivo. Se o arquivo e´ visto como um sequeˆncia de bytes, a PRR representa o enderec¸o do byte inicial do registro. Se o arquivo e´ visto como um conjunto de registros, a PRR e´ o nu´mero relativo do registro (NRR) no arquivo. 31 / 53 Acesso a Arquivos Acesso Direto em Arquivo com Registros de Tamanho Fixo Nesse caso, a PRR e´ calculada facilmente a partir do seu NRR PRR = NRR · Tamanho do registro Por exemplo, se queremos a posic¸a˜o do registro com NRR 546, e o tamanho de cada registro e´ 128, a PRR e´: 546 · 128 = 69888 Acesso Direto em Arquivo com Registros de Tamanho Varia´vel Um me´todo e´ usar um arquivo de ı´ndices para conter as PRRs de cada registro de dados. 32 / 53 Acesso a Arquivos Acesso Direto Vs SO Vs Linguagens Nos sistemas MS-DOS, Linux, Unix e Derivados: Um arquivo e´ visto como uma sequeˆncia de bytes. A linguagem de programac¸a˜o (LP) dosaplicativos pode continuar com essa visa˜o (caso do C). A LP pode usar procedimentos pro´prios para ver arquivo como um conjunto de registros (caso do PASCAL). Nota: PL/1 A linguagem PL/1 (bem como sistemas que a suportam, como VMS, OS/MVS), tem outra visa˜o da organizac¸a˜o de arquivo. Quando o arquivo e´ organizado em registros, na˜o existe acesso por bytes, mas apenas por registros. Os arquivos sa˜o tratados como uma colec¸a˜o de registros acessados atrave´s de chaves. A conversa˜o chave/enderec¸o do registro e´ realizada pelo sistema operacional. 33 / 53 Acesso a Arquivos Escolha da estrutura e do tamanho dos registros O uso do NRR implica em definir um tamanho fixo para os registros. Obviamente, esta decisa˜o esta´ relacionada ao tamanho dos campos que desejamos armazenar no arquivo. Depende se os campos possuem tamanho fixo ou varia´vel. 34 / 53 Acesso a Arquivos Registros de tamanho fixo, com campos de tamanho fixo < Campo1 >< Campo2 > . . . < Campon > Tamanho do Registro = n∑ i=1 tamanho(< Campoi >) Na˜o ha´ perdas ao n´ıvel de registros. Na˜o ha´ perdas ao n´ıvel de campos. Observac¸o˜es Se o desempenho e´ muito importante, podemos tentar ajustar o tamanho para se adaptar melhor a` organizac¸a˜o do disco. Se o disco utilizado for um t´ıpico disco organizado em setores e o tamanho do setor e´ 512 bytes (ou outro mu´ltiplo de 2), em um setor podem ser colocados exatamente 16 registros de 32 bytes cada. Assim, escolher registros de 32 bytes evita a quebra de registros entre setores. 35 / 53 Acesso a Arquivos Registros de Tamanho fixo com campos de tamanho varia´vel O registro e´ a soma dos tamanhos ma´ximos (estimados) de cada campo e dos separadores: Com indicador de tamanho de campos: < TC1 >< Campo1 >< TC2 >< Campo2 > . . . < TCn >< Campon >< Perda > Com separadores de campo: < Campo1 > | < Campo2 > | . . . | < Campon >< Perda > Pode haver perda ao n´ıvel de registro. 36 / 53 Acesso a Arquivos A escolha de um tamanho para o registro e´ mais complicada quando os comprimentos dos campos podem variar (como no exemplo dos nomes e enderec¸os). Se escolhemos um comprimento fazendo a soma do tamanho ma´ximo estimado para cada campo, teremos certeza de ter espac¸o suficiente, mas estaremos desperdic¸ando um espac¸o considera´vel. Se usarmos um tamanho de campo menor que o ma´ximo esperado, corremos o risco de perder informac¸a˜o associada a um campo. Uma maneira de evitar estes problemas e´ usar uma estrutura interna adequada para o registro. Ja´ vimos que existem 2 abordagens principais para organizar campos dentro de um registro de tamanho fixo. O primeiro usa campos de tamanho fixo. O segundo utiliza campos de tamanhos variaveis em registros de tamanho fixo, por meio de delimitadores ou indicando o tamanho de cada campo. Note, que podemos por exemplo misturar ambas abordagens, quando sabemos que alguns campos tem tamanho fixo e outros na˜o. 37 / 53 Registro Cabec¸alho Registro Cabec¸alho (Header Record) Em geral, e´ interessante manter algumas informac¸o˜es sobre o arquivo para uso futuro. Essas informac¸o˜es podem ser mantidas em um header no in´ıcio do arquivo. Algumas informac¸o˜es t´ıpicas sa˜o: Nu´mero atual de registros no arquivo Pol´ıtica de tamanho de cada registro Os tipos dos campos de cada registro Datas de criac¸a˜o e atualizac¸a˜o Figura: Registro Cabec¸alho 38 / 53 Registro Cabec¸alho Registro Cabec¸alho Ele e´ o primeiro registro do arquivo A existeˆncia de um registro cabec¸alho torna um arquivo um objeto auto-descrito (O software pode acessar arquivos de forma mais flex´ıvel). Problemas: tira a homogeneidade dos registros. O conteu´do do header difere dos demais registros do arquivo.Embora possa ser tratado como registro variante. Usando um flag para indica o tipo de registro atual. 39 / 53 Pro´xima Aula Pro´xima Aula Acesso a Arquivos Metadados Portabilidade e padronizac¸a˜o 40 / 53 Co´digos Co´digos Os co´digos foram retirados de File Structures: An Object-Oriented Approach with C ++, 3rd Edition e apresentam a descric¸a˜o das principais classes. Para a versa˜o escrita em C, consulte File Structures, 2nd Edition. escreveStream.cpp: Responsa´vel por escrever um objeto Person como uma stream de bytes. person.cpp: Fornece a descric¸a˜o da classe Person. leStream.cpp: Le uma stream de bytes, que e´ separada por um delimitador, para um objeto Person. escreveVariavel.cpp: Escreve um objeto, com campos de tamanho varia´vel (usando um buffer de tamanho fixo), em um arquivo. leVariavel.cpp: Leˆ um registro de tamanho varia´vel e o guarda em um objeto Person; delimTextBuffer.cpp: Descreve a classe que suporta campos de tamanho varia´vel que sa˜o separados por delimitadores. lengthTextBuffer.cpp: Descreve a classe que representa registros de tamanho varia´vel e fixos. fixedTextBuffer.cpp: Descreve a classe que trabalha com campos de tamanho fixo. IOBuffer.cpp: Classe pai das classes que implementara˜o os Buffers. VariableDelimFieldBuffer.cpp: Classe que herda da classe IOBuffer e descreve organizac¸a˜o em registros de tamanho varia´vel. FixedFieldBuffer.cpp: Classe que herda da classe IOBuffer e descreve organizac¸a˜o em registros de tamanho fixo. BufferFile.cpp: Classe que descreve a manipulac¸a˜o de arquivos que esta˜o ligados a tipos espec´ıficos de buffers (fixo/varia´vel). 41 / 53 Co´gidos 1 2 // Funct i on to w r i t e (<<) a Person as a st ream o f by t e s 3 ost ream & o p e r a t o r << ( ost ream & o u t p u t F i l e , Person & P) 4 { // i n s e r t ( w r i t e ) f i e l d s i n t o st ream 5 o u t p u t F i l e << p . LastName 6 << p . Fi rstName 7 << p . Address 8 << p . C i t y 9 << p . S t a t e 10 << p . ZipCode ; 11 r e t u r n o u t p u t F i l e ; 12 } Co´digo 1: escreveStream.cpp 42 / 53 Co´gidos 1 // D e f i n i t i o n o f r e c o r d to ho ld pe r son i n f o rma t i o n 2 c l a s s Person{ 3 p u b l i c : 4 char l a s t [ 1 1 ] ; 5 char f i r s t [ 1 1 ] ; 6 char a d d r e s s [ 1 6 ] ; 7 char c i t y [ 1 6 ] ; 8 char s t a t e [ 3 ] ; 9 char z i p [ 1 0 ] ; 10 } ; Co´digo 2: person.cpp 43 / 53 Co´gidos 1 // E x t r a c t i o n op e r a t o r f o r r e a d i n g d e l im i t e d f i e l d s i n t o a Person o b j e c t . 2 3 i s t r e a m & o p e r a t o r >> ( i s t r e a m & stream , Person & p ) 4 { // read d e l im i t e d f i e l d s from f i l e 5 char d e l i m ; 6 st ream . g e t l i n e ( p . LastName , 3 0 , ’ | ’ ) ; 7 i f ( s t r l e n ( p . LastName)==0) r e t u r n s t ream ; 8 st ream . g e t l i n e ( p . FirstName , 3 0 , ’ | ’ ) ; 9 s t ream . g e t l i n e ( p . C i ty , 3 0 , ’ | ’ ) ; 10 st ream . g e t l i n e ( p . State , 1 5 , ’ | ’ ) ; 11 st ream . g e t l i n e ( p . ZipCode , 1 0 , ’ | ’ ) ; 12 r e t u r n s t ream ; 13 } Co´digo 3: leStream.cpp 44 / 53 Co´gidos 1 // Funct i on Wr i tePer son w r i t e s a v a r i a b l e−l e n g t h 2 // d e l im i t e d b u f f e r to a f i l e 3 4 const i n t M a x B u f f e r S i z e = 2 0 0 ; 5 6 i n t W r i t e P e r s o n ( ost ream & stream , Person & p ) 7 { 8 char b u f f e r [ M a x B u f f e r S i z e ] ; // c r e a t e b u f f e r o f f i x e d s i z e 9 s t r c p y ( b u f f e r , p . LastName ) ; s t r c a t ( b u f f e r , ” | ” ) ; 10 s t r c p y ( b u f f e r , p . F i rstName ) ; s t r c a t ( b u f f e r , ” | ” ) ; 11 s t r c p y ( b u f f e r , p . Address ) ; s t r c a t ( b u f f e r , ” | ” ) ; 12 s t r c p y ( b u f f e r , p . C i t y ) ; s t r c a t ( b u f f e r , ” | ” ) ; 13 s t r c p y ( b u f f e r , p . S t a t e ) ; s t r c a t ( b u f f e r , ” | ” ) ; 14 s t r c p y ( b u f f e r , p . ZipCode ) ; s t r c a t ( b u f f e r , ” | ” ) ; 15 s h o r t l e n g t h=s t r le n ( b u f f e r ) ; 16 st ream . w r i t e (& l e n g t h , s i z e o f ( l e n g t h ) ) ; // w r i t e l e n g t h 17 st ream . w r i t e (& b u f f e r , l e n g t h ) ; 18 } Co´digo 4: escreveVariavel.cpp 45 / 53 Co´gidos 1 // Funct i on ReadVar i ab l ePe r son tha t r e ad s a v a r i a b l e−s i z e d Person 2 3 i n t R e a d V a r i a b l e P e r s o n ( i s t r e a m & stream , Person & p ) 4 { // read a v a r i a b l e s i z e d r e c o r d from stream and s t o r e i t i n p 5 s h o r t l e n g t h ; 6 st ream . r e a d (& l e n g t h , s i z e o f ( l e n g t h ) ) ; 7 char∗ b u f f e r = new char [ l e n g t h +1] ; // c r e a t e b u f f e r space 8 st ream . r e a d ( b u f f e r , l e n g t h ) ; 9 b u f f e r [ l e n g t h ]=0; // t e rm i na t e b u f f e r w i th n u l l 10 i s t r s t r e a m s t r b u f f ( b u f f e r ) ; // c r e a t e a s t r i n g st ream 11 s t r b u f f >> p ; // use the i s t r e am e x t r a c t i o n op e r a t o r 12 r e t u r n 1 ; 13 } Co´digo 5: leVariavel.cpp 46 / 53 Co´gidos 1 //Main methods and menbers o f c l a s s De l imTextBu f f e r 2 3 c l a s s D e l i m T e x t B u f f e r 4 { 5 p u b l i c : 6 D e l i m T e x t B u f f e r ( char Delim = ’ | ’ , i n t maxBytes = 1 0 0 0 ) ; 7 i n t Read ( i s t r e a m & f i l e ) ; 8 i n t Write ( ost ream & f i l e ) const ; 9 i n t Pack ( const char∗ s t r , i n t s i z e =−1); 10 i n t Unpack ( char∗ s t r ) ; 11 12 p r i v a t e : 13 char Delim ; // d e l i m i t e r c h a r a c t e r 14 char∗ B u f f e r ; // c h a r a c t e r a r r a y to ho ld f i e l d v a l u e s 15 i n t B u f f e r S i z e ; // c u r r e n t s i z e o f packed f i e l d s 16 i n t MaxBytes ; // maximum number o f c h a r a c t e r s i n the b u f f e r 17 i n t NextByte ; // pack ing / unpack ing p o s i t i o n i n b u f f e r 18 } ; Co´digo 6: delimTextBuffer.cpp 47 / 53 Co´gidos 1 //Main Methods and members o f c l a s s Leng thTex tBu f f e r . 2 3 c l a s s L e n g t h T e x t B u f f e r 4 { 5 p u b l i c : 6 L e n g t h T e x t B u f f e r ( i n t maxBytes =1000); 7 i n t Read ( i s t r e a m & f i l e ) ; 8 i n t Write ( ost ream & f i l e ) const ; 9 i n t Pack ( const char∗ f i e l d , i n t s i z e = −1); 10 i n t Unpack ( char∗ f i e l d ) ; 11 12 p r i v a t e : 13 char∗ B u f f e r ; // c h a r a c t e r a r r a y to ho ld f i e l d v a l u e s 14 i n t B u f f e r S i z e ; // s i z e o f packed f i e l d s 15 i n t MaxBytes ; // maximum number o f c h a r a c t e r s i n the b u f f e r 16 i n t NextByte ; // pack ing / unpack ing p o s i t i o n i n b u f f e r ; 17 } ; Co´digo 7: lengthTextBuffer.cpp: 48 / 53 Co´gidos 1 //Main Methods and members o f c l a s s F i x edTex tBu f f e r 2 3 c l a s s F i x e d T e x t B u f f e r 4 { 5 p u b l i c : 6 F i x e d T e x t B u f f e r ( i n t maxBytes = 1 0 0 0 ) ; 7 i n t A d d F i e l d ( i n t f i e l d S i z e ) ; 8 i n t Read ( i s t r e a m & f i l e ) ; 9 i n t Write ( ost ream & f i l e ) ; 10 i n t Pack ( const char∗ f i e l d ) ; 11 i n t Unpack ( char∗ f i e l d ) ; 12 13 p r i v a t e : 14 char∗ B u f f e r ; // c h a r a c t e r a r r a y to ho ld f i e l d v a l u e s 15 i n t B u f f e r S i z e ; // s i z e o f packed f i e l d s 16 i n t MaxBytes ; //maximum number o f c h a r a c t e r s i n the b u f f e r 17 i n t NextByte ; // pack ing / unpack ing p o s i t i o n i n b u f f e r 18 i n t ∗ F i e l d S i z e s ; // a r r a y o f f i e l d s i z e s 19 } ; Co´digo 8: fixedTextBuffer.cpp: 49 / 53 Co´gidos 1 //Main menbers and methods o f c l a s s IOBu f f e r 2 3 c l a s s I O B u f f e r 4 { 5 p u b l i c : 6 I O B u f f e r ( i n t maxBytes =1000); // a maximum of maxBytes 7 v i r t u a l i n t Read ( i s t r e a m &) = 0 ; // read a b u f f e r 8 v i r t u a l i n t Write ( ost ream &) const = 0 ; // w r i t e a b u f f e r 9 v i r t u a l i n t Pack ( const v o i d∗ f i e l d , i n t s i z e =−1) = 0 ; 10 v i r t u a l i n t Unpack ( v o i d∗ f i e l d , i n t maxBytes=−1) = 0 ; 11 12 p r o t e c t e d : 13 char∗ B u f f e r ; // c h a r a c t e r a r r a y to ho ld f i e l d v a l u e s 14 i n t B u f f e r S i z e ; //sum of the s i z e s o f packed f i e l d s 15 i n t MaxBytes ; // maximum number os c h a r a c t e r s i n the b u f f e r 16 } ; Co´digo 9: IOBuffer.cpp 50 / 53 Co´gidos 1 // C l a s s e s Va r i a b l e L e n g t hBu f f e r and De l imF i e l dBu f f e r 2 3 c l a s s V a r i a b l e L e n g t h B u f f e r : p u b l i c I O B u f f e r 4 { 5 p u b l i c : 6 V a r i a b l e L e n g t h B u f f e r ( i n t maxBytes =1000); 7 i n t Read ( i s t r e a m &); 8 i n t Write ( ost ream & ) const ; 9 i n t S i z e O f B u f f e r ( ) const ; // r e t u r n c u r r e n t s i z e o f b u f f e r 10 } ; 11 12 c l a s s D e l i m F i e l d B u f f e r : p u b l i c V a r i a b l e L e n g t h B u f f e r 13 { 14 p u b l i c : 15 D e l i m F i e l d B u f f e r ( char Delim=−1, i n t maxBytes = 1 0 0 0 ) ; 16 i n t Pack ( const v o i d ∗ , i n t s i z e =−1); 17 i n t Unpack ( v o i d∗ f i e l d , i n t maxBytes=−1); 18 19 p r o t e c t e d : 20 char Delim ; 21 } ; Co´digo 10: VariableDelimFieldBuffer.cpp 51 / 53 Co´gidos 1 // C l a s s F i x e d F i e l d B u f f e r 2 3 c l a s s F i x e d F i e l d B u f f e r : p u b l i c F i x e d L e n g t h B u f f e r 4 { 5 p u b l i c : 6 F i x e d F i e l d B u f f e r ( i n t maxFie lds , i n t R e c o r d S i z e =1000); 7 F i x e d F i e l d B u f f e r ( i n t maxFie lds , i n t ∗ f i e l d S i z e ) ; 8 i n t A d d F i e l d ( i n t f i e l d S i z e ) ; // d e f i n e the next f i e l d 9 i n t Pack ( const v o i d∗ f i e l d , i n t s i z e = −1); 10 i n t Unpack ( v o i d∗ f i e l d , i n t maxBytes = −1); 11 i n t NumberOfFie ld ( ) const ; // r e t u r n number o f d e f i n e d f i e l d s p r o t e c t e d 12 13 p r o t e c t e d : 14 i n t ∗ F i e l d S i z e . // a r r a y to ho ld f i e l d s i z e s 15 i n t M a xF i e ld s ; //maximum number o f f i e l d s 16 i n t NumFields ; // a c t u a l number o f d e f i n e d f i e l d s 17 } ; Co´digo 11: FixedFieldBuffer.cpp 52 / 53 Co´gidos 1 //Main data menbers and methods o f c l a s s B u f f e r F i l e 2 c l a s s B u f f e r F i l e 3 { 4 p u b l i c : 5 B u f f e r F i l e ( I O B u f f e r &); // c r e a t e w i th a b u f f e r 6 i n t Open ( char∗ f i l e n a m e , i n t MODE) ; // open an e x i s t i n g f i l e 7 i n t C r e a t e ( char∗ f i l e n a m e , i n t MODE) ; // c r e a t e a new f i l e 8 i n t C l o s e ( ) ; 9 i n t Rewind ( ) ; // r e s e t to the f i r s t data r e c o r d 10 // Inpu t and Output o p e r a t i o n s 11 i n t Read ( i n t r e c a d d r = −1); 12 i n t Write ( i n t r e c a d d r = −1); 13 i n t Append ( ) ; // w r i t e the c u r r e n t b u f f e r a t the end o f f i l e 14 15 p r o t e c t e d : 16 I O B u f f e r & B u f f e r ; // r e f e r e n c e to the f i l e ’ s b u f f e r 17 f s t r e a m F i l e ; // the C++ stream o f the f i l e 18 } ; Co´digo 12: BufferFile.cpp 53 / 53
Compartilhar