[C noobs inside] Probleme a la creation du fichier

Probleme a la creation du fichier [C noobs inside] - C++ - Programmation

Marsh Posté le 09-04-2002 à 15:53:36    

voila g un probleme le prog tourne plus ou moins mais bon il est pas finit...le probleme c que a chaque demarage il me reecrase le fichier exsistant alors que g mit une condition pour ça!!!
le code
 

Citation :


#include <stdio.h>
#include <conio.h>
#include <string.h>
 
struct bibli
{
int numero;
int volume;
char titre[20];
char auteur[20];
char edition[10];
char date[9];
};
 
struct biblise
{
int num;
int volu;
char titr[20];
char aut[20];
char edit[10];
char dat[9];
};
 
void creationprem (int);
void creationsec (int);
void affichf ();
void listprem (struct bibli,int);
void listsec (struct biblise,int);
void ajout (struct bibli,struct biblise,int);
int recherche (struct bibli,int);
void affich2 (struct bibli);
void supprimp (struct bibli,int,struct biblise,int);
int rechvide (struct biblise,int);
int rechsec (struct biblise,int);
void affich3 (struct biblise);
 
main()
{
FILE *pt,*ps;
int menu=0,listage=0,x,nbmaxfich=50,nbmaxse=40,pass=4849,code;
struct bibli vbib={0,0,"","",""};
struct biblise vbibse={0,0,"","",""};
char ecra='n';
 
clrscr();
if (pt==0)
  {
  creationprem(nbmaxfich);
  creationsec (nbmaxse);
  }
  else
  {
  printf ("\nVoulez-vous ecraser les fichiers exsistants (o/n): " );
  ecra=getche();
  if (ecra=='o';)
    {
    printf ("\nEntrez le passe: " );
    scanf("%d",&code);
    if (pass==code)
      {
      creationprem (nbmaxfich);
      creationsec (nbmaxse);
      }
      else
      {
      printf("\nVous n'avez pas l'autorisation d'?craser les fichiers" );
     getch();
      }
    }
  }
clrscr();
printf ("\n\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍ»" );
printf ("\n\t\t\tº Application 2002 º B5 º" );
printf ("\n\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍͼ" );
printf ("\n\n\n\t Pour entrer dans le menu principal pressez ENTER " );
getch();
while (menu!=6)
  {
  clrscr();
  printf ("\n  \t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»" );
  printf ("\n  \t\t\tº Menu principal º" );
  printf ("\n  \t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ" );
  printf ("\n\n\n\n\t1.Lister les fiches\n\t2.Ajouter une fiche" );
  printf ("\n\t3.Supprimer une fiche\n\t4.Modifier une fiche" );
  printf ("\n\t5.Rechercher une fiche\n\t6.Quitter le programme" );
  printf ("\n\nVotre choix: " );
  scanf ("%d",&menu);
  switch (menu)
    {
    case 1: clrscr();
     printf ("\n\n\n\t\t1.Lister le fichier primaire" );
     printf ("\n\t\t2.Lister le fichier secondaire" );
     printf ("\n\n\n\tVotre choix: " );
     scanf ("%d",&listage);
     switch (listage)
       {
       case 1: listprem (vbib,nbmaxfich);
        break;
       case 2: listsec (vbibse,nbmaxse);
        break;
       }
     break;
    case 2: clrscr();
     printf ("\n\t\t\tAJOUT D'UNE FICHE" );
     ajout(vbib,vbibse,nbmaxse);
     break;
    case 3: clrscr();
     printf ("\n\t\t\tSUPPRESSION D'UNE FICHE" );
     supprimp (vbib,nbmaxfich,vbibse,nbmaxse);
     break;
    case 4: clrscr();
     printf ("\n\t\t\tMODIFICATION D'UNE FICHE" );
     break;
    case 5: clrscr();
     printf ("\n\t\t\tRECHERCHE D'UNE FICHE" );
     x=recherche(vbib,nbmaxfich);
     if (x>=nbmaxfich+1)
       {
       ps=fopen("c:\\fich\\filesec.dat","rb" );
       fseek(ps,(x-1)*sizeof(vbibse),0);
       fread(&vbibse,sizeof(vbibse),1,ps);
       affich3(vbibse);
       getch();
       fclose(ps);
       }
       else
       {
       pt=fopen("c:\\fich\\file.dat","rb" );
       fseek(pt,(x-1)*sizeof(vbib),0);
       fread(&vbib,sizeof(vbib),1,pt);
       affich2(vbib);
       getch();
       fclose(pt);
       }
     break;
    }
  }
}
 
/*//////////////////////////////FONCTIONS/////////
 
///////////////////////*/
 
 
/*////////////////////CREATION DU FICHIER PRIMAIRE///////////////////////*/
 
void creationprem (int nbmaxfich)
{
FILE *pt;
struct bibli vbib={0,0,"","","",""};
int i;
 
pt=fopen("c:\\fich\\file.dat","wb" );
for (i=1;i<=nbmaxfich;i++)
  {
  fwrite(&vbib,sizeof(vbib),1,pt);
  }
fclose(pt);
}
 
/*////////////////////////////////////////////////
 
////////////////////*/
 
void creationsec (int nbmaxse)
{
FILE *pt;
struct biblise vbibse={0,0,"","","",""};
int i;
 
pt=fopen("c:\\fich\\filsec.dat","wb" );
for (i=1;i<=nbmaxse;i++)
  {
  fwrite(&vbibse,sizeof(vbibse),1,pt);
  }
fclose(pt);
}
 
/*////////////////////////////////////////////////
 
////////////////////*/
 
void affichf (void)
{
printf ("\nCl?   volume   titre      auteur      edition    date" );
printf ("\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 
ÄÄÄÄÄÄÄÄÄÄ" );
}
 
/*////////////////////////////////////////////////
 
////////////////////*/
 
void listprem (struct bibli vbib,int nbmaxfich)
{
FILE *pt;
int comp=0;
 
pt=fopen("c:\\fich\\file.dat","rb" );
while (comp<=nbmaxfich)
  {
  clrscr();
  affichf();
  do
    {
    comp++;
    fread(&vbib,sizeof(vbib),1,pt);
    printf ("\n%2d %5d    %s      %s       %s      %s",vbib.numero,
    vbib.volume,vbib.titre,vbib.auteur,vbib.edition,vbib.date);
    }
    while (comp%20!=0);
  printf ("\n\n\t\t\t//APPUYEZ SUR ENTER//" );
  getch();
  }
fclose(pt);
}
 
/*////////////////////////////////////////////////
 
//////////////////////*/
 
void listsec (struct biblise vbibse,int nbmaxse)
{
FILE *pt;
int comp=0;
 
pt=fopen("c:\\fich\\filsec.dat","rb" );
while (comp<=nbmaxse)
  {
  clrscr();
  affichf();
  do
    {
    comp++;
    fread(&vbibse,sizeof(vbibse),1,pt);
    printf ("\n%2d %5d    %s      %s       %s      %s",vbibse.num,
    vbibse.volu,vbibse.titr,vbibse.aut,vbibse.edit,vbibse.dat);
    }
    while (comp%20!=0);
  printf ("\n\n\t\t\t//APPUYEZ SUR ENTER//" );
  getch();
  }
fclose(pt);
}
 
/*////////////////////////////////////////////////
 
//////////////////////*/
 
void ajout (struct bibli vbib,struct biblise vbibse,int nbmaxse)
{
FILE *pt,*ps;
int i,cle=0,pad,pos;
 
 
pt=fopen("c:\\fich\\file.dat","r+b" );
do
  {
  printf ("\n\nVeuillez entrer un identifiant: " );
  scanf ("%d",&cle);
  pad=(cle%1000)+1;
  fseek(pt,(pad-1)*sizeof(vbib),0);
  fread(&vbib,sizeof(vbib),1,pt);
  if (vbib.numero==cle)
    {
    clrscr();
    printf ("\n\nCet idantifiant est deja utilis?" );
    }
  }
  while (vbib.numero==cle);
if (vbib.numero!=0)
  {
  fclose(pt);
  pos=rechvide (vbibse,nbmaxse);
  ps=fopen("c:\\fich\\filsec.dat","r+b" );
  fseek(ps,(pos)*sizeof(vbibse),0);
  vbibse.num=cle;
  printf ("\nEntrez le nø de volume: " );
  scanf("%d",&vbibse.volu);
  fflush(stdin);
  printf ("\nEntrez le titre: " );
  gets (vbibse.titr);
  fflush(stdin);
  printf ("\nEntrez le nom de l'auteur: " );
  gets (vbibse.aut);
  fflush(stdin);
  printf ("\nEntrez le nom de l'editeur: " );
  gets (vbibse.edit);
  fflush(stdin);
  printf ("\nEntrez la date: " );
  gets (vbibse.dat);
  fflush(stdin);
  fwrite(&vbibse,sizeof(vbibse),1,ps);
  fclose(ps);
  }
  else
  {
  pt=fopen("c:\\fich\\file.dat","r+b" );
  fseek(pt,(pad-1)*sizeof(vbib),0);
  vbib.numero=cle;
  printf ("\nEntrez le nø de volume: " );
  scanf("%d",&vbib.volume);
  fflush(stdin);
  printf ("\nEntrez le titre: " );
  gets (vbib.titre);
  fflush(stdin);
  printf ("\nEntrez le nom de l'auteur: " );
  gets (vbib.auteur);
  fflush(stdin);
  printf ("\nEntrez le nom de l'editeur: " );
  gets (vbib.edition);
  fflush(stdin);
  printf ("\nEntrez la date: " );
  gets (vbib.date);
  fflush(stdin);
  fwrite(&vbib,sizeof(vbib),1,pt);
  fclose(pt);
  }
}
 
/*////////////////////////////////////////////////////////////////////*/
 
int recherche (struct bibli vbib,int nbmaxfich)
{
FILE *pt;
int i,c,x;
char nom[30];
 
fflush(stdin);
printf ("\n\nEntrez le nom de la fiche a rechercher: " );
gets(nom);
fflush(stdin);
pt=fopen("c:\\fich\\file.dat","rb" );
for (i=0;i<=nbmaxfich+1 || c==0;i++)
  {
  fread(&vbib,sizeof(vbib),1,pt);
  c=strcmp(vbib.titre,nom);
  if(c==0)
    {
    x=(vbib.numero%1000)+1;
    return(x);
    }
  if (i==nbmaxfich+1)
    {
    printf ("\n\nCe livre n'exsiste pas dans le fichier primaire" );
    getch();
    }
  }
}
 
/*///////////////////////////////////////////////////////////////////*/
 
int rechvide (struct biblise vbibse,int nbmaxse)
{
FILE *pt;
int i;
 
pt=fopen("c:\\fich\\filsec.dat","rb" );
for (i=0;i<=nbmaxse+1 || vbibse.num==0;i++)
  {
  fread(&vbibse,sizeof(vbibse),1,pt);
  if(vbibse.num==0)
    {
    return(i);
    }
  if (i==nbmaxse+1)
    {
    printf ("\n\nLe fichier est plein, impossible d'ajouter une fiche" );
    getch();
    }
  }
fclose(pt);
}
 
/*///////////////////////////////////////////////////////////////////*/
 
void affich2 (struct bibli vbib)
{
clrscr();
printf ("\nIdentifiant: %d",vbib.numero);
printf ("\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" );
printf ("\nNøde volume : %d",vbib.volume);
printf ("\nTitre :       %s",vbib.titre);
printf ("\nAuteur :      %s",vbib.auteur);
printf ("\nEdition :     %s",vbib.edition);
printf ("\nDate :        %s",vbib.date);
}
 
/*////////////////////////////////////////////////
 
///////////////////*/
 
void affich3 (struct biblise vbibse)
{
clrscr();
printf ("\nIdentifiant: %d",vbibse.num);
printf ("\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ" );
printf ("\nNøde volume : %d",vbibse.volu);
printf ("\nTitre :       %s",vbibse.titr);
printf ("\nAuteur :      %s",vbibse.aut);
printf ("\nEdition :     %s",vbibse.edit);
printf ("\nDate :        %s",vbibse.dat);
}
 
/*////////////////////////////////////////////////
 
///////////////////*/
 
void supprimp (struct bibli vbib,int nbmaxfich,struct biblise vbibse,int nbmaxse)
{
FILE *pt,*ps;
int pad;
char rep;
 
pad=recherche(vbib,nbmaxfich);
if (pad>=nbmaxfich+1)
  {
  pad=rechsec(vbibse,nbmaxse);
  if (pad<nbmaxse+1)
    {
    printf ("\n\nVOULEZ VOUS VRAIMENT SUPPRIMER CETTE FICHE (o/n)" );
    rep=getche();
    if (rep=='o';)
      {
      ps=fopen("c:\\fich\\file.dat","r+b" );
      fseek(ps,(pad-1)*sizeof(vbibse),0);
      vbibse.num=0;
      fwrite(&vbibse,sizeof(vbibse),1,ps);
      clrscr();
      printf ("\nCette fiche a ?t? supprim?e." );
      getch();
      }
      else
      {
      clrscr();
      printf ("\n\n\nSuppression annul?e." );
      }
    }
  }
  else
  {
if (pad<nbmaxfich+1)
  {
  printf ("\n\nVOULEZ VOUS VRAIMENT SUPPRIMER CETTE FICHE (o/n)" );
  rep=getche();
  if (rep=='o';)
    {
    pt=fopen("c:\\fich\\file.dat","r+b" );
    fseek(pt,(pad-1)*sizeof(vbib),0);
    vbib.numero=0;
    fwrite(&vbib,sizeof(vbib),1,pt);
    clrscr();
    printf ("\nCette fiche a ?t? supprim?e." );
    getch();
    }
    else
    {
    clrscr();
    printf ("\n\n\nSuppression annul?e." );
    }
  }
  }
fclose(pt);
}
 
/*////////////////////////////////////////////////
 
/////////////////////*/
 
int rechsec (struct biblise vbibse,int nbmaxse)
{
FILE *pt;
int i,c;
char nom[30];
 
fflush(stdin);
printf ("\n\nEntrez le nom de la fiche a rechercher: " );
gets(nom);
fflush(stdin);
pt=fopen("c:\\fich\\filsec.dat","rb" );
for (i=0;i<=nbmaxse+1 || c==0;i++)
  {
  fread(&vbibse,sizeof(vbibse),1,pt);
  c=strcmp(vbibse.titr,nom);
  if(c==0)
    {
    return(i);
    }
  if (i==nbmaxse+1)
    {
    printf ("\n\nCe livre n'exsiste pas" );
    getch();
    }
  }
}
 
/*//////////////////////////////////////////////////////////////////////*/

 

[jfdsdjhfuetppo]--Message édité par bistou--[/jfdsdjhfuetppo]


---------------
:sol:
Reply

Marsh Posté le 09-04-2002 à 15:53:36   

Reply

Marsh Posté le 09-04-2002 à 18:29:35    

c paske tu l'ouvres en mode "wb"
le w signifie que tu l'ouvres en mode ecriture, mais ECRASE LE CONTENU PRECEDENT si le fichier existe
faut l'ouvrir en "w+" (donc dans ton cas puiske ca a l'air d'etre du binaire, le mode d'ouverture est "w+b"

Reply

Marsh Posté le 09-04-2002 à 19:22:16    

w+ écrase le fichier aussi, il faut utiliser r+ si tu veux conserver l'ancien fichier.

 

[jfdsdjhfuetppo]--Message édité par neerd--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 09-04-2002 à 19:29:29    

neerd a écrit a écrit :

w+ écrase le fichier aussi, il faut utiliser r+ si tu veux conserver l'ancien fichier.  
 
 




 
t sur de ca ???
sinon tu peux utiliser a+ aussi ...

Reply

Marsh Posté le 09-04-2002 à 19:32:51    

j'ai sa d'écrit ds un bouquin mais pour être sûr j'ai fait un test et sauf si Dev-C++ et buggé sinon c'est le cas  ;)

Reply

Marsh Posté le 09-04-2002 à 19:36:14    

ok autant pour moi ... c t un vague souvenir, ca fait un an que g pas fait de C ...

Reply

Marsh Posté le 09-04-2002 à 20:53:47    

ouais je c mais en fait c pas le premier probleme il faut qu'il l'ecrase si on a le pass pour le faire
mais la il devrait s'arreter puisque pt ne peut pas etre a 0 vu qu'il y a un fichier exsistant et pourtant il rentre ds le if(pt==0) et ça c pas normal avant que j'ajoute ma fonction supprimer il me fesait pas ça, mais ça a rien avoir


---------------
:sol:
Reply

Marsh Posté le 09-04-2002 à 20:56:42    

Si j'ai bien compris ton code, pt est un pointeur, donc si tu veux savoir ca valleur c'est (*pt == 0) non?

Reply

Marsh Posté le 09-04-2002 à 21:51:23    

ben oui c un pointeur sur fichier
declaré en FILE *pt
donc si le ficher exsiste pt prend une valeur et s'il n'exsiste pas il est logiqueùment a 0
mais la il rentre ds le if malgré la condition mais c pas normal  :crazy:


---------------
:sol:
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed