Buscar

Organização de Arquivos - Conceitos Básicos sobre Estrutura de Arquivos (Parte 1)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Outros materiais