lectura de archivos .dbf

DAGGER
13 de Noviembre del 2003
Necesito hacer un trabajo practico en C, que se basa en la lectura de un archivo .dbf (de DBASE).

Alguien tendria un codigo fuente en C que me sirva como ejemplo para la lectura de un .dbf?


cesar
13 de Noviembre del 2003
#include<stdio.h>
#include<conio.h>
#include<alloc.h>


struct TFieldHeader
{
char version;
char date[3];
unsigned long num_regs;
unsigned int num_bytes_header;
unsigned int num_bytes_reg;
char reservado1[3];
char reservado2[13];
char reservado3[4];
};


struct TFieldDescriptor
{
char nombre[11];
char tipo;
unsigned long direccion;
char longitud;
char decimal_count;
char resevador[14];
};

void ImprimeFieldHeader(struct TFieldHeader FieldHeader);
void ImprimeFieldDescriptor(struct TFieldDescriptor FieldDescriptor);
void CargaArregloFieldDescriptor(struct TFieldDescriptor *arregloFieldDescriptor,
int total_campos,FILE *dbf);
void MuestraRegistro(struct TFieldHeader FieldHeader,
struct TFieldDescriptor *arregloFieldDescriptor,int total_campos,FILE *dbf,
int IdRegistro);



void main (void)
{
FILE *dbf;
struct TFieldHeader FieldHeader;
struct TFieldDescriptor *arregloFieldDescriptor;
int total_campos;

clrscr();

if ((dbf=fopen("pedidos.dbf","rb"))!=NULL)
{
fread(&FieldHeader,sizeof(struct TFieldHeader),1,dbf);
ImprimeFieldHeader(FieldHeader);

total_campos=(FieldHeader.num_bytes_header-1-32)/32;
arregloFieldDescriptor=(struct TFieldDescriptor *)malloc(sizeof(struct TFieldDescriptor)*total_campos);
printf("Total campos : %dn",total_campos);
getche();
CargaArregloFieldDescriptor(arregloFieldDescriptor,total_campos,dbf);
for (int i=1;i<=FieldHeader.num_regs;i++)
{
//getche();
MuestraRegistro(FieldHeader,arregloFieldDescriptor,total_campos,dbf,i);
}
free(arregloFieldDescriptor);
fclose(dbf);
}
getche();
}

void ImprimeFieldHeader(struct TFieldHeader FieldHeader)
{
printf("version = %xn num_regs = %lun num_bytes_header = %un num_bytes_regs = %un",
FieldHeader.version,
FieldHeader.num_regs,
FieldHeader.num_bytes_header,
FieldHeader.num_bytes_reg);
}

void ImprimeFieldDescriptor(struct TFieldDescriptor FieldDescriptor)
{
printf("nombre = %sn tipo = %cn direccion = %lun longitud = %dn decimal_count = %dn",
FieldDescriptor.nombre,
FieldDescriptor.tipo,
FieldDescriptor.direccion,
FieldDescriptor.longitud,
FieldDescriptor.decimal_count);
}

void CargaArregloFieldDescriptor(struct TFieldDescriptor *arregloFieldDescriptor,
int total_campos,FILE *dbf)
{
struct TFieldDescriptor FieldDescriptor;
for (int i=0;i<total_campos;++i)
{
fseek(dbf,32*(i+1),0);
fread(&FieldDescriptor,sizeof(struct TFieldDescriptor),1,dbf);
arregloFieldDescriptor[i]=FieldDescriptor;
ImprimeFieldDescriptor(FieldDescriptor);
}
}

void MuestraRegistro(struct TFieldHeader FieldHeader,
struct TFieldDescriptor *arregloFieldDescriptor,int total_campos,FILE *dbf,
int IdRegistro)
{
char **datos;
char eliminado;
int ind;
datos=(char**)malloc(sizeof(char *)*total_campos);

for (int i=0;i<total_campos;++i)
datos[i]=(char *)malloc(sizeof(char)*arregloFieldDescriptor[i].longitud+1);

ind=FieldHeader.num_bytes_header+(FieldHeader.num_bytes_reg*(IdRegistro-1));
fseek(dbf,ind,0);
fread(&eliminado,sizeof(char),1,dbf);

if (eliminado==0x20) eliminado='!';

for (i=0;i<total_campos;++i)
{
int cantidad=arregloFieldDescriptor[i].longitud;
fread(datos[i],sizeof(char),cantidad,dbf);
datos[i][cantidad]='';
}
printf("%c",eliminado);
for (i=0;i<total_campos;++i) printf("%s",datos[i]);
printf("n");

for (i=0;i<total_campos;++i) free(datos[i]);
free(datos);
}