La Web del Programador: Comunidad de Programadores
 
    Pregunta:  1699 - ABRIR DBF EN C++
Autor:  Robert Loaiza
Existe una libreria en C++ que me permita abrir archivos dbf y poder manipularlos

  Respuesta:  Euro Urbina
Con este codigo puedo abrirlos y leerlos, faltaria crear rutinas para escribirlos, solo seria tratar de hacerlo.

#include
#include
#include
#include

typedef unsigned char int8;
typedef unsigned short int16;
typedef unsigned int int32;
typedef char * string;

struct CAMPOS { // Estructura de los Campos de la Tabla.
int8 name[11]; // Nombre del Campo. Byte 0-10
int8 type; // Tipo del Campo. 11
int32 where; // Desplazamiento del Campo. 12-15
int8 leng; // Longuitud del Campo. 16
int8 dec; // Lugares Decimales. 17
int8 flags; // Banderas. 18
int8 rese1[13]; // Reservado. 19-31
};

struct TABLA { // Estructura del Registro de la Tabla.
int8 type; // Typo de Tabla. Byte 0
int8 ymd[3]; // Ultima modificacion. 1-3
int32 numreg; // Numero de Registros. 4-7
int16 firreg; // Posicion del Primer Registro de Datos. 8-9
int16 lonreg; // Lomguitud del Registro de Datos. 10-11
int8 res1[16]; // Reservado. 12-27
int8 flags; // Bandera. 28
int8 codpag; // Codigo de Pagina. 29
int8 res2[2]; // Reservado. 30-31
};

char* substr(char* cadena, int comienzo, int longitud)
{
if (longitud == 0) longitud = strlen(cadena)-comienzo-1;
char *nuevo = (char*)malloc(sizeof(char) * longitud);
strncpy(nuevo, cadena + comienzo, longitud);
nuevo[longitud]=0;
return nuevo;
}

void main(void)
{
FILE *fdbf; // Puntero al Archivo .dbf
TABLA header; // Cabecera del Arhivo .dbf
CAMPOS *fields; // Lista de Campos del .dbf
int16 numcmp; // Numero de Campos del .dbf
int16 i,desp=1;
string buf; // Buffer para el Registro de Datos.
string NombTable="libro2.dbf"; // Aqui el Nombre del .dbf
char separador; // Separador entre la Cabecera y los Registros de Datos

fdbf = fopen(NombTable,"rb");
fseek(fdbf,0L,0);
fread(&header,32,1,fdbf);
// Calculo de la cantidad de Campos del .dbf
if (header.type == 0x30) numcmp = (header.firreg-296)/32;
else numcmp = (header.firreg-32)/32;
if ((fields = new CAMPOS[numcmp]) == NULL) {
printf("Error en la inicializacion de SYSDBF #1");
return;
}
for (i=0;i fread(&fields[i],32,1,fdbf);

printf("-----------------------------------------
");
printf("Tabla : %-12s
",NombTable);
printf("Tipo de Tabla : %d
",header.type);
printf("Numero de Registros : %d
",header.numreg);
printf("Numero de Campos : %d
",numcmp);
printf("Longuitud del Registro : %d
",header.lonreg);
printf("Codigo de Pagina : %d
",header.codpag);
printf("-----------------------------------------
");
printf("Nombre Tipo Long Dec
");
for (i=0;i printf("%-11s %c %3d %2d
",
fields[i].name,fields[i].type,fields[i].leng,fields[i].dec);
}
printf("-----------------------------------------
");
fread(&separador,1,1,fdbf); // Fin de Cabecera DBF y comienzo de los Datos.

buf = new char[header.lonreg];
fread(buf,header.lonreg,1,fdbf);
for (i=0;i printf("%-11s :%s
",fields[i].name,substr(buf,desp,fields[i].leng));
desp+=fields[i].leng;
}

printf("
");
fclose(fdbf);
delete fields;
delete buf;
system("pause");
}

  Respuesta:  jesus luna carlos
Esa utileria que tu necesitas se llama CODEBASE de la compania de software SEQUITER.