lectura de archivos .dbf
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?
Alguien tendria un codigo fuente en C que me sirva como ejemplo para la lectura de un .dbf?
#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);
}
#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);
}
