c fichier

c fichier - C - Programmation

Marsh Posté le 16-03-2005 à 20:13:46    

j ai une fonction encodage et une lecture seulement lors de la lecture il ne lit que la derniere fiche saisie et pas tt les fiches ???
 
void encodage(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
   int i=0;
          fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
   while(i<nbr)
   {  
            fwrite(&nbutil,sizeof(int),1,fp);
            fwrite(&dermat,sizeof(int),1,fp);
     pb->pos=i;
     pt->matr=dermat+1;
            printf("entrez le nom\n" );
     fflush(stdin);
     gets(pt->nom);
            strcpy(pb->nom,pt->nom);
     fwrite(&pb,sizeof(*(pb)),1,fpi);
     fseek(fpi,0,SEEK_CUR);
     printf("entrez le prenom\n" );
     fflush(stdin);
     gets(pt->prenom);
     system("cls" );
            fseek(fp,0,SEEK_CUR);
     fwrite(&pt,sizeof(*(pt)),1,fp);
     i++;
     nbutil++;
     dermat++;  
   }
   fcloseall();
}
 
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
          fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
          {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
                         fread(&dermat,sizeof(int),1,fp);
                         printf("dernier matricule%d",dermat);
    printf("\n" );
                         fread(&pt,sizeof(*(pt)),1,fp);
                     printf("matricule:%d",(pt->matr));
                  printf("\n" );
                         puts(pt->nom);
                  puts(pt->prenom);
                  printf("\n" );
    i++;
                 nbutil++;
                 dermat++;
        }
            }
   
}
nbr c est le nombre de fiche sasie par l utilisateur .

Reply

Marsh Posté le 16-03-2005 à 20:13:46   

Reply

Marsh Posté le 16-03-2005 à 20:14:12    

void ajout(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
   while(i<nbr)
   {  
        fwrite(&nbutil,sizeof(int),1,fp);
        fwrite(&dermat,sizeof(int),1,fp);
     pb->pos=i;
     pt->matr=dermat+1;
        printf("entrez le nom\n" );
     fflush(stdin);
     gets(pt->nom);
        strcpy(pb->nom,pt->nom);
     fwrite(&pb,sizeof(*(pb)),1,fpi);
  fseek(fpi,0,SEEK_CUR);
     printf("entrez le prenom\n" );
     fflush(stdin);
     gets(pt->prenom);
     system("cls" );
        fseek(fp,0,SEEK_CUR);
     fwrite(&pt,sizeof(*(pt)),1,fp);
     i++;
  nbutil++;
     dermat++;  
   }
   fcloseall();
}
/************************************************************************
*I:ADRESSE DE DEBUT DE TABLEAU ET NOMBRE DE FICHE                       *
*P:TRI PAR VECTEUR D INDEX                                              *
*O:---------------------------------------------------------------------*
************************************************************************/
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
      {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
             fread(&dermat,sizeof(int),1,fp);
             printf("dernier matricule%d",dermat);
    printf("\n" );
             fread(&pt,sizeof(*(pt)),1,fp);
             printf("matricule:%d",(pt->matr));
          printf("\n" );
             puts(pt->nom);
          puts(pt->prenom);
          printf("\n" );
    i++;
          nbutil++;
          dermat++;
    }
      }
   
}

Reply

Marsh Posté le 16-03-2005 à 20:15:11    

si j incremente mon pointeur de structure de fiche le programme plante lorsque je le quitte sans aucune raison ????

Reply

Marsh Posté le 16-03-2005 à 20:20:00    

jon_w748 a écrit :

si j incremente mon pointeur de structure de fiche le programme plante lorsque je le quitte sans aucune raison ????


  • struct INDEX, struct FICHE, c'est quoi ?
  • Tu as publié 2 fonctions 'affiche()'. Laquelle est la bonne ?
  • fflush(stdin) n'est pas défini par la norme. Il peut arriver n'importe quoi...
  • gets() est un bug qu'il ne faut pas utiliser. Pour des saisies correctes :


http://mapage.noos.fr/emdel/notes.htm#saisie


Message édité par Emmanuel Delahaye le 16-03-2005 à 21:12:56

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-03-2005 à 20:27:40    

struct fiche une un structure de fiche {
matr
nom [20]
prenom[15]
}
pour le gets j ai deja modifier j utilise fgets je vai remettre la derniere version

Reply

Marsh Posté le 16-03-2005 à 20:28:50    

void ajout(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
 int i=0;
    fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
 fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
 while(i<nbr)
 {  
      fwrite(&nbutil,sizeof(int),1,fp);
      fwrite(&dermat,sizeof(int),1,fp);
   pb->pos=i;
   pt->matr=dermat+1;
      printf("entrez le nom\n" );
   fflush(stdin);
   fgets(pt->nom,20,stdin);
      strcpy(pb->nom,pt->nom);
      tri(pb,nbr);
      fseek(fpi,0,SEEK_CUR);
   fwrite(&pb,sizeof(pb),1,fpi);
   printf("entrez le prenom\n" );
   fflush(stdin);
   fgets(pt->prenom,15,stdin);
   system("cls" );
      fseek(fp,0,SEEK_CUR);
   fwrite(&pt,sizeof(pt),1,fp);    
   i++;
   nbutil++;
   dermat++;    
 }
 fcloseall();
}
 
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
      {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
             fread(&dermat,sizeof(int),1,fp);
             printf("dernier matricule%d",dermat);
    printf("\n" );
             fread(&pt,sizeof(*(pt)),1,fp);
             printf("matricule:%d",(pt->matr));
          printf("\n" );
             puts(pt->nom);
          puts(pt->prenom);
          printf("\n" );
    i++;
          nbutil++;
          dermat++;
    }
      }
   
}
 

Reply

Marsh Posté le 16-03-2005 à 21:19:10    

jon_w748 a écrit :

struct fiche une un structure de fiche {
matr
nom [20]
prenom[15]
}
pour le gets j ai deja modifier j utilise fgets je vai remettre la derniere version


Manque le type de 'matr'.
 
Attention que fgets() laisse trainer le '\n'. Il y a un traitement 'intelligent' à faire...
 
D'autre part, je t'ai déjà dit que fflush (stdin) ne fonctionnait pas.
 
Autre chose. Tu utilises des paramètres comme variables locales. C'est inutilement complexe. Défini les en locales, et c'est tout. Tu n'a pas indiqué non plus comment tu appelais les fonctions (pas de  main())
 
Enfin, les fichiers doivent être ouverts en "rb" en lecture ou en "wb" en écriture. Le mélange des deux ("r+b", "w+b" ) mène souvent à la confusion et à la destruction des fichiers... fflushall() n'existe pas. Il faut fermer les fichiers proprement avec fclose().
 
Il n'y a probablement pas besoin de fseek()...
 
C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...


Message édité par Emmanuel Delahaye le 16-03-2005 à 21:33:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-03-2005 à 21:36:33    

sous le compilateur visual studio 6.0 le fflush stdin permet de vider le buffer de clavier enfin c est ce que on nous a dit.
j ai essayer d increment mon pointeur de structure de fiche pt++; dans ajout et dans affichage il affiche comme il le faut mais lorsque dans mon menu je fait quitter il plante
 

Reply

Marsh Posté le 16-03-2005 à 22:56:12    

jon_w748 a écrit :

sous le compilateur visual studio 6.0 le fflush stdin permet de vider le buffer de clavier enfin c est ce que on nous a dit.


Peut être, mais c'est une extension non portable. Ailleurs, au mieux ça ne fait rien, au pire, ça plante tout... C'est le propre d'un comportement indéfini...

Citation :


j ai essayer d increment mon pointeur de structure de fiche pt++; dans ajout et dans affichage il affiche comme il le faut mais lorsque dans mon menu je fait quitter il plante


Quel menu ? On ne connait pas l'ensemble du code...


Message édité par Emmanuel Delahaye le 16-03-2005 à 22:56:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-03-2005 à 23:08:14    

et avec les bonnes balises pour présenter le code, c'est mieux...


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 16-03-2005 à 23:08:14   

Reply

Marsh Posté le 17-03-2005 à 07:03:44    

w000 so 31337 tout ces buffer overflow.
Aprend plutot a structurer ton code :)
 
‰?Ô¥#?|

Reply

Marsh Posté le 17-03-2005 à 08:04:59    

Bonjour

Citation :

C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...  


Professionnelement je manipule tous les jours des fichiers de données textes de 5Go que je met en binaire pour faire 500Mo. Ces fichiers sont utilisables sur tous systèmes windows, mac, unix, linux et sur processeur grand boutien et petit boutien (little endian)
Le binaire est tout à fait portable si on s'en donne la peine et surtout infiniment plus compacte. Balader 500Mo de données par réseau lent est plus facile que 5Go quand à l'archivage !
le format tiff est je le crois un format binaire et il se lit partout.
Il est évident qu'il est plus facile de reconstruire la structure d'un fichier texte quand on ne la connais pas. Le binaire peut être un début de codage confidentiel de données.
Pour un débutant il vaut peut être mieux utiliser un fichier texte mais il ne faut pas se fermer la porte du binaire.
Cordialement

Reply

Marsh Posté le 17-03-2005 à 08:11:13    

db__ a écrit :

Citation :

C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...  


Professionnelement je manipule tous les jours des fichiers de données textes de 5Go que je met en binaire pour faire 500Mo.


Il existe des format de données binaires portables (XDR, BER), mais leur mise en oeuvre un peu plus complexe que ce qui est proposé. Quand à l'optimisation, il est bien évident qu'il faut utiliser la compression (zip ou autre) avant de transmettre ou d'archiver des gros fichiers textes.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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