organização de arquivos
DESCRIPTION
Pesquisa e Ordenação de DadosTRANSCRIPT
Organização de Arquivos
Prof. Flávio Humberto Cabral Nunes
Conteúdo
1. Organização dos campos
2. Organização dos registros
� Capítulo: 3 (APOSTILA).
Organização dos Campos
1. Campos com tamanho fixo
2. Campos com indicador de tamanho3. Campos com delimitador
4. Campo com rótulo
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
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;
}
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
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;
}
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|
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;
}
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, ‘|’);
Campos com Marcação
� Estrutura utilizada em XML� Indica início e fim do campo
<titulo>File Structures</titulo>
<autor>Michael Folk</autor>
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
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
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
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);
}
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;
}
Utilizar um Índice com Ponteiros para os Registros
ArquivoAuxiliar
Arquivo
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
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>