organização de arquivos

19
Organização de Arquivos Prof. Flávio Humberto Cabral Nunes

Upload: jessica-souza

Post on 16-Apr-2015

27 views

Category:

Documents


4 download

DESCRIPTION

Pesquisa e Ordenação de Dados

TRANSCRIPT

Page 1: Organização de Arquivos

Organização de Arquivos

Prof. Flávio Humberto Cabral Nunes

Page 2: Organização de Arquivos

Conteúdo

1. Organização dos campos

2. Organização dos registros

� Capítulo: 3 (APOSTILA).

Page 3: Organização de Arquivos

Organização dos Campos

1. Campos com tamanho fixo

2. Campos com indicador de tamanho3. Campos com delimitador

4. Campo com rótulo

Page 4: Organização de Arquivos

Campos com Tamanho Fixo

Class Livro {

char titulo[41]; // 40 bytes para título

char autor[41]; // 40 bytes para autor

}

File Structure

Managing Gigabytes

Michael Folk

Ian Witten

Page 5: Organização de Arquivos

Campos com Tamanho Fixo

class Livro {public:

char titulo[41];char autor[41];

int writefixed(ostream &);int readfixed(istream &);

}

int Livro::writeFixed(ostream &fout) {fout.write(titulo, 40);

fout.write(autor, 40);fout.flush();if(fout.fail())

return false;return true;

}

Int Livro::readFixed(istream &fin) {fin.read(titulo, 40);fin.read(autor, 40);if(fin.fail())

return false;return true;

}

Page 6: Organização de Arquivos

Campos com Indicador de Tamanho

� Começa cada campo com seu indicador de tamanho

class Livro {public:

char titulo[41];char autor[41];int writeLen(ostream &);int readLen(istream &);

}

15FileStructures12Michael Folk

Page 7: Organização de Arquivos

Campos com Indicador de Tamanho

int Livro::writeLen(ostream &) {int n;

n = strlen(titulo);fout.write((char*)&n, sizeof(int));fout.write(titulo, n);n = strlen(autor);fout.write((char*)&n, sizeof(int));

fout.write(autor,n);fout.flush();if(fout.fail())

return false;return true;

}

int Livro::readLen(istream &) {int n;

fin.read((char*)&n, sizeof(int));fin.read(titulo, n);if(fin.fail())

return false;titulo[n] = 0;fin.read((char*)&n, sizeof(int));fin.read(autor, n);autor[n] = 0;if(fin.fail())

return false;return true;

}

Page 8: Organização de Arquivos

Campos com Delimitador

� Delimitador indica o início e o fim de cada campo� Conteúdo do campo não pode ter um delimitador

class Livro {

private:

char delimitador;

public:

char titulo[41];

char autor[41];

int writeDelim(ostream &);

int readDelim(istream &);

Livro() {

delimitador = ‘|’;

}

}

FileStructures|Michael Folk|

Page 9: Organização de Arquivos

Campos com Delimitador

int Livro::writeDelim(ostream &){

fout.write(titulo, strlen(titulo));

fout.put(delimitador);

fout.write(autor, strlen(autor));

fout.put(delimitador);

fout.flush();

if(fout.fail())

return false;

return true;

}

int Livro::readDelim(istream &){

char d;

fin.getline(titulo, 40, delimitador);

fin.getline(autor, 40, delimitador);

if(fin.fail())

return false;

return true;

}

Page 10: Organização de Arquivos

Campos com Rótulo

� Campo representado pela expressão campo=valor

� Consome muito espaço� Requer um delimitador

Titulo=File Structures|autor=Michael Folk|

fin.getline(livro.titulo, 40, ‘|’);

Page 11: Organização de Arquivos

Campos com Marcação

� Estrutura utilizada em XML� Indica início e fim do campo

<titulo>File Structures</titulo>

<autor>Michael Folk</autor>

Page 12: Organização de Arquivos

Organização de Registros

1. Usar registros com um número previsível de bytes2. Usar registros com um número previsível de

campos3. Começar cada registro com um indicador de

tamanho4. Usar um índice com ponteiros para os registros5. Colocar um delimitador no final de cada registro6. Usar marcação

Page 13: Organização de Arquivos

Registros com Um Número Previsível de Bytes

� Método mais simples

� Baseia-se em campos com tamanho fixo� Método utilizado em C++ ao se escrever o

registro

Page 14: Organização de Arquivos

Registros com Um Número Previsível de Campos

� Diz-se que o campos tem um número fixo de campos

� A cada n campos, muda-se o registro

Page 15: Organização de Arquivos

Começar cada Registro com Um Indicador de Tamanho

const int MaxBufferSize = 200;

int writePerson(ostream &stream, Person &p) {

char buffer[MaxBufferSize];

strcpy(buffer, p.LastName); strcat(buffer, ‘|’);

strcpy(buffer, p.FirstName); strcat(buffer, ‘|’);

strcpy(buffer, p.Address); strcat(buffer, ‘|’);

strcpy(buffer, p.City); strcat(buffer, ‘|’);

strcpy(buffer, p.State); strcat(buffer, ‘|’);

strcpy(buffer, p.ZipCode); strcat(buffer, ‘|’);

short length = strlen(buffer);

stream.write(&length, sizeof(length));

stream.write(&buffer, length);

}

Page 16: Organização de Arquivos

Começar cada Registro com Um Indicador de Tamanho

int ReadVariablePerson(istream &stream, Person &p){

short length;

stream.read(&length, sizeof(length));

char *buffer = new char[length + 1];

stream.read(buffer, length);

buffer[length] = 0;

...

//transfere o buffer para o objeto (metodos 2 ou 3 d e campos)

...

return 1;

}

Page 17: Organização de Arquivos

Utilizar um Índice com Ponteiros para os Registros

ArquivoAuxiliar

Arquivo

Page 18: Organização de Arquivos

Colocar um Delimitador no Final de cada Registro

� Análogo ao método para campos

� Delimitador deve ser diferente do delimitador de campos

� Exemplo: \n

Page 19: Organização de Arquivos

Usar Marcação

� Utilizado por sistemas que trabalham com XML

� Não há mais a rigidez da estrutura tradicional de arquivo

<livro>

<titulo>File Structures</titulo>

<autor>Michael Folk</autor>

</livro>