Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Leer un archivo .dbf con c++

309 views
Skip to first unread message

Carlos Navarro

unread,
Feb 20, 2002, 1:17:06 PM2/20/02
to
Ocupo saber si álguien me puede indicar como puedo hacer para leer
un archivo .dbf (dbase o fox) en c++.

gracias


Enviado desde http://c.aforo.com


Clayman

unread,
Feb 20, 2002, 2:22:04 PM2/20/02
to
Carlos Navarro <carlos_...@yahoo.com> wrote in
news:a50p72$3v6$1...@talia.mad.ttd.net:

Bueno, la verdad es que existen muchas maneras...Pero bueno, como
seguramente te interesará la más fácil, te sugiero que lo hagas mediante el
motor de BD ODBC, con un driver para DBase o Fox. Claro, suponiendo que la
aplicación accede a la BD en local, etc.
Un saludo.

mrd dux

unread,
Feb 26, 2002, 3:47:51 AM2/26/02
to
On 20 Feb 2002 18:17:06 GMT, Carlos Navarro <carlos_...@yahoo.com>
wrote:

Depende de:

quieres consultar los datos... abrir tablas ...
o simplemente quieres leer los datos .

puedes usar el CodeBase librerias de borland para manejo de base de
datos , y creo que estas librerias eran DBF creo.

sino te lo puedes montar a tu rollito pues los Dbf son ficheros
separados por comas creo recordar. los binarios son los idx .
>

Luis S.

unread,
Feb 26, 2002, 8:44:30 AM2/26/02
to
Son legibles... pero no estan separados por comas. Mas bien diria yo
tabulaciones, pero no se el numero exacto.

"mrd dux" <aduceN...@VALEmaster.es> escribió en el mensaje
news:O0t7PCNAeKJ69o...@4ax.com...

Mick

unread,
Feb 26, 2002, 3:41:20 PM2/26/02
to
> Son legibles... pero no estan separados por comas. Mas bien diria yo
> tabulaciones, pero no se el numero exacto.

Tampoco estan serparados por tabulaciones, son ficheros binarios,
en la cabecera del archivo se encuentran definidios los tipos de campos con
sus tamñlos etc,y a continuacion los datos, la estructura es publica
(cualquier busqueda en google te dara la informacion) y realmente muy
simple, es muy sencillo hacer una rutina que lea este tipo de archivos.

Salud2 !!!

Luis S.

unread,
Feb 26, 2002, 5:57:34 PM2/26/02
to
Yo es que acabo de abrir unos cuantos y estan los caracteres separados por
espacios en blanco.... por eso lo decia

Leonel Ramirez

unread,
Mar 3, 2002, 11:20:42 PM3/3/02
to
Aqui tienes un ejemplo, tiene algunos pequeños detalles que corregirle pero
creo que te
dara una idea de como abrir una dbf desde C, o mas bien de como son las
cabeceras de una dbf internamente. Espero y te ayude un poco.

Leonel.

#include "stdio.h"

#define DbfLongMaxReg 4096
#define DbfMaxCampos 128

FILE *pDbf,*Tily; /*Puntero a la base de datos*/

unsigned char TotalCampos;
char BufferDeDatos[DbfLongMaxReg];
char NomF[60];

struct DbfHead
{
unsigned char HeadTipo;
unsigned char Year;
unsigned char Mes;
unsigned char Dia;
long RegisCont;
int HeaderLong;
int RecordLong;
unsigned char Reserv1[20];
}DbfHeading;

struct DbfFields
{
char NombreCampo[11];
char TipoCampo;
int Spare1;
int Spare2;
unsigned char Ancho;
unsigned char Decimales;
unsigned char Reserv2[14];
}DbfCampos;

struct Leonel
{
char Dato[80];
}Leonel1;

struct Leonel Leonel2[DbfMaxCampos];
struct DbfFields CamposDbf[DbfMaxCampos];
struct DbfFields *pCamposDbf;
struct DbfFields *xRecord2;
struct DbfHead *xRecord1;

/*Obtine la longitud fisica de la cabecera de la Dbf*/
size_t hRecSize = sizeof( DbfHeading );

/*Obtine la longitud fisica de los campos de la Dbf*/
size_t cRecSize = sizeof( DbfCampos );

/*void OpenDbfD(char Leo[60]);*/
void OpenDbfD(void);
void LeeCabecera(void);
void LeeCampos(void);
void LeeContenidos(long R);
void ImprimeEstructura(void);
/*void graba(void);*/
void crea(void);

main() /*(int argv,char *argc[])*/
{
int Ch = 0;
long Cont = 1;
xRecord1 = &DbfHeading;
xRecord2 = &DbfCampos;
pCamposDbf = &CamposDbf;
TotalCampos=0;
clrscr();
/*

if(argc[1]==NULL)
{
printf("Faltan Argumentos....!!!!!\n\n");
exit(1);
}
strcpy(NomF,argc[1]);
strcat(NomF,".dbf");
OpenDbfD(NomF);
*/

OpenDbfD();
LeeCampos();

gotoxy(20,1);printf("Total de campos = %u ",TotalCampos);
while(Ch!=0x1b)
{
LeeContenidos(Cont);
Cont++;
Ch=getch();
}
fclose(Tily);
ImprimeEstructura();
fclose(pDbf);
}


/*void OpenDbfD(char DbfNom[60])*/
void OpenDbfD(void)
{
if((pDbf=fopen("mb2.dbf","rb"))==NULL)
{
printf("Error al abrir el archivo o el archivo no existe");
getch();
exit(0);
}
fseek(pDbf,0L,SEEK_SET); /*pone el puntero al tope del archivo */
fread(&DbfHeading,hRecSize,1,pDbf); /*Lee el encabezado de la DBF*/
Tily = fopen("mb3.dbf","wb");
/* fseek(Tily,0L,SEEK_SET);*/
fwrite(&DbfHeading,hRecSize,1,Tily);
printf("Tipo head = %x \n",xRecord1->HeadTipo);getch();
}

void LeeContenidos(long R)
{
unsigned char I;
char Buffer[134];
if(!feof(pDbf))
{ clrscr();
printf("LongReg. %i ",xRecord1->RecordLong);
fseek(pDbf,xRecord1->HeaderLong+1+xRecord1->RecordLong*(R-1),0);
/*Posiciona el puntero al primer Registro*/
gotoxy(72,1);printf("R = %Li\n ",R);
/* for(I=0;I<TotalCampos;I++)
{ */
fread(&Buffer,xRecord1->RecordLong,1,pDbf);
/*fread(&BufferDeDatos,CamposDbf[I].Ancho,1,pDbf);*/
/*fwrite(&Buffer,xRecord1->RecordLong,1,Tily);*/
printf("%s=%s %u\n
",CamposDbf[I].NombreCampo,Buffer,CamposDbf[I].Ancho);
strncpy(BufferDeDatos," ");
getch();
/* }*/
}
else
{
printf("F¡n de archivo.......");
getch();
}
}


void LeeCampos(void)
{
fseek(pDbf,hRecSize,0); /* SEEK_SET = 0 */
fread(&DbfCampos,cRecSize,1,pDbf); /*Lee el 1ro. campo de la DBF*/
fwrite(&DbfCampos,cRecSize,1,Tily);
printf("campo = %s \n",xRecord2->NombreCampo);
do
{
strcpy(CamposDbf[TotalCampos].NombreCampo,xRecord2->NombreCampo);
CamposDbf[TotalCampos].TipoCampo = xRecord2->TipoCampo;
CamposDbf[TotalCampos].Spare1 = xRecord2->Spare1;
CamposDbf[TotalCampos].Spare2 = xRecord2->Spare2;
CamposDbf[TotalCampos].Ancho = xRecord2->Ancho;
CamposDbf[TotalCampos].Decimales = xRecord2->Decimales;
strcpy(CamposDbf[TotalCampos].Reserv2 , xRecord2->Reserv2);
TotalCampos++;
fread(&DbfCampos,cRecSize,1,pDbf); /*Lee el resto de campos de la DBF*/
if(strlen(xRecord2->NombreCampo)>=1 && xRecord2->Spare2==0)
fwrite(&DbfCampos,cRecSize,1,Tily);
printf("campo = %s \n",xRecord2->NombreCampo);
}while(strlen(xRecord2->NombreCampo)>=1 && xRecord2->Spare2==0);
getch();

}

void ImprimeEstructura(void)
{
unsigned char I;
clrscr();
gotoxy(24,2);printf("Estructura de la base de datos ");
gotoxy(20,4);printf("NOMBRE TIPO\tLONG.\tDECIMALES");
gotoxy(18,5);printf("--------------------------------------------");

for(I=0;I<TotalCampos;I++)
{
gotoxy(20,I+6);printf("%s",pCamposDbf->NombreCampo);
gotoxy(36,I+6);printf("%c",pCamposDbf->TipoCampo);
gotoxy(44,I+6);printf("%u",pCamposDbf->Ancho);
gotoxy(52,I+6);printf("%u",pCamposDbf->Decimales);
pCamposDbf++;
}
getch();
}


0 new messages