gracias
Enviado desde http://c.aforo.com
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.
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 .
>
"mrd dux" <aduceN...@VALEmaster.es> escribió en el mensaje
news:O0t7PCNAeKJ69o...@4ax.com...
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 !!!
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();
}