Creation d'un fichier dbf (en c)

Soyez le premier à donner votre avis sur cette source.

Vue 14 594 fois - Téléchargée 1 309 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

A voir également

Ajouter un commentaire Commentaires
NHenry Messages postés 15037 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 6 février 2023 156
Modifié par NHenry le 22/01/2015 à 12:26
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...
lynxtyle Messages postés 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
8 sept. 2008 à 06:04
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.