Creation d'un fichier dbf (en c)

Soyez le premier à donner votre avis sur cette source.

Vue 13 829 fois - Téléchargée 1 272 fois

Description

Un petit programme pour creer (et ecrire) une base des donnees dBase, realise avec le language C simple, sans utiliser autre logiciel.

Source / Exemple :


//04-sep-2008 21:47:34

#include <dos.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#define O_CREAT  0x0100
#define O_TRUNC  0x0200
#define O_BINARY 0x8000
#define O_RDWR   4
#define S_IWRITE 0x0080
#define S_IREAD  0x0100

typedef unsigned short ushort;
typedef unsigned long  ulong;
typedef unsigned char  uchar;

uchar nom_dbf[]="EXEMPLE.DBF";
short nf;
ulong nart;
ushort RCS;
#define NB_CHAMPS 11
struct BASE
{
   uchar nom_champ[11];
   uchar typ_champ;
   uchar long_champ;
   uchar nb_dec;
} strbase[NB_CHAMPS]=
{
   "COD_SOC"    ,'N', 4,0,
   "NOM_SOC"    ,'C',40,0,
   "COD_LIEU"   ,'N', 4,0,
   "NOM_LIEU"   ,'C',24,0,
   "COD_FONC"   ,'N', 4,0,
   "NOM_FONC"   ,'C',24,0,
   "ID"         ,'N', 8,0,
   "NOM"        ,'C',24,0,
   "SALAIRE"    ,'N',14,3,
   "IMPOT"      ,'N',14,3,
   "RESTE"      ,'N',14,3
};
struct ENTET_BASE
{
   uchar  version;
   uchar  annee;
   uchar  mois;
   uchar  jour;
   ulong  nb_art;
   ushort lg_antet;
   ushort RCS;
   uchar  zero[20];
   struct
   {
      uchar nom_champ[11];
      uchar typ_champ;
      ulong adresse;
      uchar long_champ;
      uchar nb_dec;
      uchar zero[14];
   } champ[NB_CHAMPS];
} aa;
uchar dbf[2048];
uchar man[100];
struct date d;
ushort i;
ulong salaire,impot,reste,nb_inreg;

void main(void)
{
   getdate(&d);
   aa.version=3;
   aa.annee=d.da_year-1900;
   aa.mois=d.da_mon;
   aa.jour=d.da_day;
   aa.nb_art=0;
   aa.lg_antet=0;
   aa.RCS=1;
   memset(aa.zero,'\0',20);
   for(i=0;i<NB_CHAMPS;i++)
   {
      strncpy(aa.champ[i].nom_champ,strbase[i].nom_champ,11);
      aa.champ[i].typ_champ=strbase[i].typ_champ;
      aa.champ[i].adresse=aa.RCS;
      aa.champ[i].long_champ=strbase[i].long_champ;
      aa.champ[i].nb_dec=strbase[i].nb_dec;
      memset(aa.champ[i].zero,'\0',14);
      aa.RCS+=aa.champ[i].long_champ;
   }
   RCS=aa.RCS;
   aa.lg_antet=(NB_CHAMPS+1)*32+1;
   if((nf=open(nom_dbf,O_CREAT|O_BINARY|O_TRUNC|O_RDWR,S_IWRITE|S_IREAD))<1)
   {
      printf("\nErreur dans la creation du fichier %s.",nom_dbf);
      return;
   }
   RCS=aa.lg_antet;
   write(nf,&aa,RCS-1);
   man[0]=0x0D;
   write(nf,man,1);
   RCS=aa.RCS;
   salaire=1000000;
   nb_inreg=0;
   //
   //Exemple
   //
   for(i=0;i<1234;i++)
   {
      memset(&dbf,' ',aa.RCS);
      sprintf(man,"%04u",i+1);
      strncpy(dbf+aa.champ[0].adresse,man,4);
      sprintf(man,"Societe numero %u%40s",i+1,"");
      strncpy(dbf+aa.champ[1].adresse,man,40);
      sprintf(man,"%04u",i+11);
      strncpy(dbf+aa.champ[2].adresse,man,4);
      sprintf(man,"Lieu de travail numero %u%24s",i+11,"");
      strncpy(dbf+aa.champ[3].adresse,man,24);
      sprintf(man,"%04u",i+101);
      strncpy(dbf+aa.champ[4].adresse,man,4);
      sprintf(man,"Fonction numero %u%24s",i+101,"");
      strncpy(dbf+aa.champ[5].adresse,man,24);
      sprintf(man,"%04u",i+1001);
      strncpy(dbf+aa.champ[6].adresse,man,4);
      sprintf(man,"Employe avec ID %u%24s",i+1001,"");
      strncpy(dbf+aa.champ[7].adresse,man,24);
      sprintf(man,"%14.3f",1e-3*salaire);
      strncpy(dbf+aa.champ[8].adresse,man,14);
      impot=floor(16e-2*salaire+0.5);
      sprintf(man,"%14.3f",1e-3*impot);
      strncpy(dbf+aa.champ[9].adresse,man,14);
      reste=salaire-impot;
      sprintf(man,"%14.3f",1e-3*reste);
      strncpy(dbf+aa.champ[10].adresse,man,14);
      write(nf,&dbf,RCS);
      salaire+=1234;
      nb_inreg++;
   }
   man[0]=0x1A;
   write(nf,man,1);
   lseek(nf,4l,SEEK_SET);
   write(nf,&nb_inreg,4l);
   close(nf);
}

Codes Sources

Ajouter un commentaire Commentaires
Messages postés
14827
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 octobre 2021
157
Quelles erreurs ?
As-tu essayer de les corriger ?
Es-tu sûr que la version de ton EDI, elle est peut être incompatible avec la version du code (qui date de 2008 quand même)
Merci beaucoup pour ce programme rempli d'erreur
visual studio m'affiche 10 000 erreurs en copiant collant ton programme, très utile...
Messages postés
79
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
31 octobre 2011
2
Je dirai une de plus... bon c'est lisible et compréhensible mais celle si doit avoir un but d'apprentissage, si possible rapide, du thème abordé... donc mon regret c'est de ne pas voir un commentaire sur tes 2 sources sur ce sujet...
Voilà c'est le seul reproche qu'on peut faire...

Sinon pour donner un intérêt à ces sources sur les fichiers DBF, c'est souvant le format de fichier utilisé pour les relevés des GPS...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.