Sunday, April 8, 2012

To Retrieve and manipulate .dbf files through c program (Mini Project)

I had devloped this progarme during my training in Sixth semester B.E.(comp Sc.).this program effectively connects .dbf database files in the c program and performs various functions on it


Code :

// This is devloped by narender

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXFIELDS 1000
#include<mem.h>
#include<string.h>
void main(int argc, char *argv[])
{ char *p,*q,*r,*buf;
  typedef char string11[12];
  FILE *in,*out,*out1;
  int a,i,j,n,field_pos[MAXFIELDS+1],nfield=0,pos,lrec;
  char *record,field_type[MAXFIELDS];
 // string11 field_data[500];
  string11 field_name[MAXFIELDS];
  struct
  { char  version;    /* dBase version */
    char  datum[3];   /* date of last update YYMMDD */
    long  nrec;       /* nr of records in th database file */
    short nhead;      /* nr of bytes in the header */
    short lrec;       /* nr of bytes in the record */
    char  dum1[2];
    char  transact;   /* flag for incomplete transaction */
    char  encrypt;    /* encryption flag */
    char  mdx;        /* flag for presence of mdx-file */
    char  dum2[3];
  } header;

  struct
  { char  name[11];         /* fieldname zero filled */
    char  type;             /* field type (C, D, F, L, M, N) */
    char  dum1[4];
    unsigned char  length;  /* field length in binary */
    char  ndec;             /* field decimal count in binary */
    char  dum2[2];
    char  workid;           /* work area ID */
    char  dum3[11];
    char data[10];
  } field;

  switch(argc)
  { case 1:   in=stdin;
          break;
    case 2:   if ((in = fopen(argv[1],"rb")) == NULL)
          { fprintf(stderr,"Input file %s not found
",argv[1]);
        exit(1);
          }
          break;
    default:  fprintf(stderr,"Usage: %s dbase_file >
database
",argv[0]);
          fprintf(stderr,"Or: cat dbase_file | %s >database
",argv[0]);
          exit(1);
  }
  fread(&header,32,1,in);
  n=header.lrec;
  pos=1;
  // a=field_name[3];
  while (n>1)
  { if (nfield==MAXFIELDS)
    { fprintf(stderr,"Too many fields
");
      exit(1);
    }
    fread(&field,32,1,in);
    strcpy(field_name[nfield],field.name);
    field_type[nfield]=field.type;
   //  printf("
FIELD: %s",field_name[3]);

    field_pos[nfield++]=pos;
    pos+=(int)field.length;
    n-=(int)field.length;
  }
     for (i=1;i<nfield;i++)
   {
    printf("%s%c",field_name[i],i==nfield-1?'
':'    ');
  }

 // for (i=0;i<nfield;i++) printf(   "!%s%c",
field_name[i],i==nfield-1?'
':'    ');
  field_pos[nfield]=pos; /* one extra for length calculation of last
field
*/
 // printf("
%s",field_name[3].data);
  fread(&i,1,1,in); /*read field terminator */
  if (i!=0xD)
  { fprintf(stderr,"Illegal field terminator; more than %d
fields?
",MAXFIELDS);
    exit(1);
  }

   lrec=header.lrec;
   record=malloc(lrec+2);
   for (i=1;i<header.nrec;i++)
   {
    if (fread(record,lrec,1,in)!=1)
    {
      fprintf(stderr,"Error reading record %d
",i+1);
      exit(1);
     }

    if (*record!='*')  /* if not a deleted record */
    for (j=1;j<nfield;j++)
    {
      if(j==1)
      {
       p=record+field_pos[j];             /* first char of the field */
       q=record+field_pos[j+1]-1;         /* last char of the field */
       while (*p==' ' && p<=q) p++;        /* remove leading spaces */
       while (*q==' ' && p<=q) *(q--)='

No comments:

Post a Comment