Hash com arquivos binários c
#include
#define hashLimit 13
struct reg
{
int codigo; char nome[50]; int status,elo;
};
typedef struct reg Reg;
FILE* initFile()
{
FILE *arq = fopen("dados.dat","wb"); Reg reg; int i; reg.codigo = 0; reg.status = 1; reg.elo = 0; strcpy(reg.nome,"Livre"); for(i=0;i0) { printf("Insira o nome\n"); fflush(stdin); gets(reg.nome); fflush(stdin); reg.elo = 0; reg.status = 1; } return reg;
} char buscaHash(int codigo)
{
FILE *arq = fopen("dados.dat","rb"); Reg reg; char achou=0; int pos = hash(codigo); fseek(arq,pos*sizeof(Reg),0); fread(®,sizeof(Reg),1,arq); if(reg.codigo ==codigo) achou =1; else { if(reg.elo>0) { while(reg.elo != 0) { fseek(arq,reg.elo*sizeof(Reg),0); fread(®,sizeof(Reg),1,arq); if(reg.codigo ==codigo) achou =1; } } } fclose(arq); return achou;
}
int length(FILE *arq)
{
fseek(arq,0,2); return ftell(arq)/sizeof(Reg);
}
void insereRegistro(Reg reg,FILE *arq)
{
Reg regdad; int pos; pos=hash(reg.codigo); fseek(arq,pos*sizeof(Reg),0); fread(®dad,sizeof(Reg),1,arq); if(regdad.codigo==0) { fseek(arq,pos*sizeof(Reg),0); fwrite(®,sizeof(Reg),1,arq); } else { if(!buscaHash(reg.codigo)) { reg.elo = regdad.elo; regdad.elo = length(arq); fseek(arq,pos*sizeof(Reg),0); fwrite(®dad,sizeof(Reg),1,arq);