Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupération de données d'un fichier binaire

Sujet résolu
    25 mai 2017 à 21:19:50

    Bonsoir,

    J'ai besoin d'aide car j'ai une erreur de récupération de données d'un fichier binaire pour la construction d'une liste linéaire.

    Voici ma structure :

    struct _Personnes
    {
        char nom[30];
        char prenom[30];
        char titre[120];
        struct _Personnes *svt ;
    };
    typedef struct _Personnes Personnes;

    Mon main :

    int main()
    {
        FILE *fp;
        short choix = 1;
        Personnes *pPers=NULL;
        char r;
        fp=fopen(FICHIER,"rb");
        if(fp!=NULL) { while(!feof(fp)) { fread(pPers,sizeof(Personnes),1,fp); } fclose(fp); }
        while (choix != 0)
        {
            choix = Menu ();
            pPers=AppelChoix (pPers,choix);
            do
            {
                printf("\n Appuyer sur entree pour continuer.");
                fflush(stdin);
                r=getchar();
            }while(r!='\n');
            system("cls");
        }
        return 0;
    }

    J'ai surligné en gras où je fais la récupération des données.

    Voici ma fonction qui sauvegarde dans le fichier :

    void Sauve(Personnes *pPers)
    {
        FILE *fp;
        fp=fopen(FICHIER,"wb");
        if(fp!=NULL)
        {
            while(pPers != NULL)
            {
                fwrite(pPers,sizeof(Personnes),1,fp);
                pPers=pPers->svt;
            }
    
            fclose(fp);
        }
    }
    Le problème est que lorsque je sauvegarde dans le fichier, les données sont bien ajoutés. Mais quand je lance le programme et que le fichier existe, je n'arrive pas à récupérer les données.
    Donc si quelqu'un sait m'aider ce serait sympa.
    Merci d'avance
    Kallidus
    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2017 à 22:44:58

      Yop,

      dans le main à la ligne 8 tu demandes à read( ) de stocker du contenu à l'adresse pointée par pPers ... zut alors :p

      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2017 à 23:49:23

        J'ai changé, je reçois bien les données dans pers.

        int main()
        {
            FILE *fp;
            short choix = 1;
            Personnes *pPers=NULL;
            Personnes pers;
            char r;
            fp=fopen(FICHIER,"rb");
            if(fp!=NULL)
            {
                while(!feof(fp))
                {
                    fread(&pers,sizeof(Personnes),1,fp);
                    printf("nom:%s",pers.nom);
                }
                fclose(fp);
            }
            while (choix != 0)
            {
                choix = Menu ();
                pPers=AppelChoix (pPers,choix);
                do
                {
                    printf("\n Appuyer sur entree pour continuer.");
                    fflush(stdin);
                    r=getchar();
                }while(r!='\n');
                system("cls");
            }
            return 0;
        }

        mais comment faire pour l'afficher avec la fonction Affichage et que ce soit pPers qui reçoit les données?

        Code complet

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <ctype.h>
        
        #define FICHIER "donnees.dat"
        struct _Personnes
        {
            char nom[30];
            char prenom[30];
            char titre[120];
            struct _Personnes *svt ;
        };
        typedef struct _Personnes Personnes;
        
        short Menu();
        Personnes * AppelChoix (Personnes*,short c);
        Personnes * Ajout (Personnes*);
        Personnes * Suppression (Personnes *);
        void Affichage (Personnes*);
        void LireNomPropre(char *,short);
        void Sauve(Personnes *);
        
        int main()
        {
            FILE *fp;
            short choix = 1;
            Personnes *pPers=NULL;
            Personnes pers;
            char r;
            fp=fopen(FICHIER,"rb");
            if(fp!=NULL)
            {
                while(!feof(fp))
                {
                    fread(&pers,sizeof(Personnes),1,fp);
                    printf("nom:%s",pers.nom);
                }
                fclose(fp);
            }
            while (choix != 0)
            {
                choix = Menu ();
                pPers=AppelChoix (pPers,choix);
                do
                {
                    printf("\n Appuyer sur entree pour continuer.");
                    fflush(stdin);
                    r=getchar();
                }while(r!='\n');
                system("cls");
            }
            return 0;
        }
        short Menu()
        {
            short ch;
            do
            {
                printf ("Veuillez encoder votre choix : \n");
                printf ("\t(1) Ajouter un acteur\n");
                printf ("\t(2) Supprimer une acteur\n");
                printf ("\t(3) Afficher les acteurs\n");
                printf ("\t(4) Sauver dans le fichier\n");
                printf ("\t(0) Quitter\n");
                scanf ("%hd", &ch);
            } while (ch < 0 || ch > 4);
            return ch;
        }
        Personnes * AppelChoix (Personnes*pPersAlpha,short c)
        {
            switch (c)
            {
                case 1 :
                    pPersAlpha=Ajout (pPersAlpha);
                    break;
                case 2 :
                    pPersAlpha=Suppression (pPersAlpha);
                    break;
                case 3 :
                    Affichage (pPersAlpha);
                    break;
                case 4 :
                    Sauve(pPersAlpha);
                    break;
            }
            return pPersAlpha;
        }
        Personnes * Ajout(Personnes*pPers)
        {
            Personnes *pprec,*pcur,*ptemp;
            pprec=NULL;
            pcur=pPers;
            ptemp = (Personnes *) malloc (sizeof(Personnes));
            if(ptemp==NULL)
                printf("Liste vide");
            else
            {
                printf("\n Encodez le nom : ");
                LireNomPropre(ptemp->nom,30);
                printf("\n Encodez le prenom : ");
                LireNomPropre(ptemp->prenom,30);
                printf("\n Encodez le titre : ");
                LireNomPropre(ptemp->titre,130);
            }
            while(pcur!=NULL&&(strcmp(ptemp->nom,pcur->nom)>0||strcmp(ptemp->nom,pcur->nom)==0)&&strcmp(ptemp->prenom,pcur->prenom)>0)
            {
                pprec=pcur;
                pcur=pcur->svt;
            }
            if(pprec==NULL)
            {
                ptemp->svt=pPers;
                pPers=ptemp;
            }
            else
            {
                ptemp->svt=pcur;
                pprec->svt=ptemp;
            }
            return pPers;
        }
        void Sauve(Personnes *pPers)
        {
            FILE *fp;
            fp=fopen(FICHIER,"wb");
            if(fp!=NULL)
            {
                while(pPers != NULL)
                {
                    fwrite(pPers,sizeof(Personnes),1,fp);
                    pPers=pPers->svt;
                }
        
                fclose(fp);
            }
        }
        Personnes *Suppression(Personnes *pPers)
        {
            Personnes *ptemp,*pprec;
            char vec[30];
            short err=0;
        
            if(pPers==NULL)
                printf("\n Aucun Nom\n");
            else
            {
                printf("\n Encodez le nom a supprimer : ");
                LireNomPropre(vec,30);
        
                ptemp=pPers;
                pprec=NULL;
                while(ptemp->svt!=NULL && strcmp(ptemp->nom,vec)<0)
                {
                    pprec=ptemp;
                    ptemp=ptemp->svt;
                }
                if(strcmp(ptemp->nom,vec)==0)
                {
                    //AffichageDonnee(ptemp);
                    if(pprec==NULL)
                        pPers=pPers->svt;
                    else
                        pprec->svt=ptemp->svt;
                    free(ptemp);
                }
                else
                    err=1;
                if(err==1)
                    printf("\n Nom inconnu\n");
                else
                    printf("\n Nom supprime\n");
            }
        
            return pPers;
        }
        void Affichage(Personnes *pPers)
        {
            if(pPers==NULL)
                printf("\n Aucune personne\n");
            else
            {
                while(pPers!=NULL)
                {
                    printf("\n Nom : %s ", pPers->nom);
                    printf("\n Prenom : %s ", pPers->prenom);
                    printf("\n Titre : %s ", pPers->titre);
                    printf("\n ________________________________ \n");
                    pPers=pPers->svt;
                }
            }
        }
        void LireNomPropre(char *p,short nbmax)
        {
            char c,*pc;
            short i,err=0;
            do
            {
                i=0;
                pc=p;
                err=0;
                fflush(stdin);
                c=getchar();
                if(c=='\n')
                    err=1;
                else
                {
                    c=toupper(c);
                    *pc=c;
                    pc++;
                    i++;
                    c=getchar();
                }
        
                while ((i <= nbmax) && (c != '\n')&&err==0)
                {
                    if(c>='A'&&c<='Z')
                        c=tolower(c);
                    else
                    {
                        if(c=='-'||c==' ')
                        {
                            *pc=c;
                            pc++;
                            c=getchar();
                            if(c==' '||c=='\n')
                                err=1;
                            else
                                c=toupper(c);
                        }
                        if((c<'A'||c>'Z')&&(c<'a'||c>'z')&&c!=' '&&c!='-')
                            err=1;
                    }
                    i++;
                    *pc = c;
                    pc++;
                    c=getchar();
                }
                if(i>nbmax)
                    err=1;
                if(err!=0)
                    printf("\n Reencodez : ");
            }while(err!=0);
            *pc = '\0';
        }
        




        • Partager sur Facebook
        • Partager sur Twitter
          26 mai 2017 à 0:06:02

          Re,

          Nop c'est pas bon :( Tu as un pointeur Ppers, il est destiné à contenir l'adresse d'une structure. Ton objectif, c'est de lire des données, et de les stocker en mémoire, donc dans une zone mémoire valide. Cette zone mémoire valide, tu peux y accéder si tu as un pointeur qui connait son adresse. C'est le rôle de Ppers, il doit avoir pour valeur une adresse, l'adresse d'une zone mémoire valide pour contenir une structure.

          Dans ton premier post, l'adresse contenue par Ppers est NULL, donc y stocker des données c'est évidemment impossible.

          Dans ton second post, tu essayes de stocker les données à l'adresse de Ppers ... il y a confusion ici, il ne faut pas confondre l'adresse de Ppers, et l'adresse contenue par Ppers. Ppers est une variable, elle a une adresse, et elle a pour valeur une adresse (une autre), tu vois le truc ?

          • Partager sur Facebook
          • Partager sur Twitter
            26 mai 2017 à 2:44:04

            Ok. Merci de m'aider.

            Comment faire la construction d'une liste linéaire pour que pPers reçoit les données et que je puisse afficher les données avec la fonction affichage.

            J'ai essayé ceci :

            int main()
            {
                FILE *fp;
                short choix = 1;
                Personnes *pPers,*perss=NULL;
                Personnes pers;
                char r;
                fp=fopen(FICHIER,"rb");
                if(fp!=NULL)
                {
                    pPers=(Personnes*)malloc(sizeof(Personnes));
                    while(!feof(fp))
                    {
                        fread(&pers,sizeof(Personnes),1,fp);
                        if(perss==NULL)
                            perss=&pers;
                        strcpy(pers.nom,pPers->nom);
                        strcpy(pers.prenom,pPers->prenom);
                        strcpy(pers.titre,pPers->titre);
                        pers.svt=pPers->svt;
                    }
                    fclose(fp);
                }
                else
                    pPers=NULL;
                while (choix != 0)
                {
                    choix = Menu ();
                    if(perss!=NULL)
                        pPers=perss;
                    pPers=AppelChoix (pPers,choix);
                    do
                    {
                        printf("\n Appuyer sur entree pour continuer.");
                        fflush(stdin);
                        r=getchar();
                    }while(r!='\n');
                    system("cls");
                }
                return 0;
            }



            • Partager sur Facebook
            • Partager sur Twitter
              30 mai 2017 à 15:54:49

              Personne ne sait comment on construit une liste linéaire à partir d'un fichier binaire?
              • Partager sur Facebook
              • Partager sur Twitter
                30 mai 2017 à 16:25:12

                Gam' t'as expliqué ce qu'il fallait changer, une fois fait ce devrait marcher
                • Partager sur Facebook
                • Partager sur Twitter
                  3 juin 2017 à 17:30:24

                  Bonjour, grâce à l'aide d'un ami, j'y suis arrivé donc voici la solution finale à comment récupérer des données à partir d'un fichier binaire

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h>
                  #include <ctype.h>
                  
                  #define FICHIER "donnees.dat"
                  struct _Personnes
                  {
                      char nom[30];
                      char prenom[30];
                      char titre[120];
                      struct _Personnes *svt ;
                  };
                  typedef struct _Personnes Personnes;
                  
                  struct _PersonnesSave
                  {
                      char nom[30];
                      char prenom[30];
                      char titre[120];
                  };
                  typedef struct _PersonnesSave PersonnesSave;
                  
                  short Menu();
                  Personnes *RecupDonnees();
                  Personnes *AppelChoix (Personnes*,short c);
                  Personnes *Ajout (Personnes*);
                  Personnes *Tri(Personnes *,Personnes *,Personnes *);
                  void EchangeStruct(Personnes*,PersonnesSave*);
                  void Affichage (Personnes*);
                  void Sauve(Personnes *);
                  
                  int main()
                  {
                      short choix = 1;
                      Personnes *pPers=NULL;
                      char r;
                      pPers=RecupDonnees();
                      while (choix != 0)
                      {
                          choix = Menu ();
                          pPers=AppelChoix (pPers,choix);
                          do
                          {
                              printf("\n Appuyer sur entree pour continuer.");
                              fflush(stdin);
                              r=getchar();
                          }while(r!='\n');
                          system("cls");
                      }
                      return 0;
                  }
                  void EchangeStruct(Personnes*ptemp,PersonnesSave*pPersAlpha)
                  {
                      strcpy(ptemp->nom,pPersAlpha->nom);
                      strcpy(ptemp->prenom,pPersAlpha->prenom);
                      strcpy(ptemp->titre,pPersAlpha->titre);
                  }
                  Personnes *Tri(Personnes *pPers,Personnes *pcur,Personnes *ptemp)
                  {
                      Personnes *pprec=NULL;
                      while(pcur!=NULL&&(strcmp(ptemp->nom,pcur->nom)>0||(strcmp(ptemp->nom,pcur->nom)==0&&strcmp(ptemp->prenom,pcur->prenom)>0)))
                      {
                          pprec=pcur;
                          pcur=pcur->svt;
                      }
                      if(pprec==NULL)
                      {
                          ptemp->svt=pPers;
                          pPers=ptemp;
                      }
                      else
                      {
                          ptemp->svt=pcur;
                          pprec->svt=ptemp;
                      }
                      return pPers;
                  }
                  Personnes * RecupDonnees()
                  {
                      FILE *fp;
                      PersonnesSave pPersAlpha;
                      Personnes *pPers=NULL,*ptemp,*pcur;
                  
                      fp=fopen(FICHIER,"rb");
                      if(fp!=NULL)
                      {
                          fread(&pPersAlpha,sizeof(PersonnesSave),1,fp);
                          while(!feof(fp))
                          {
                              pcur=pPers;
                              ptemp=(Personnes*)malloc(sizeof(Personnes));
                              EchangeStruct(ptemp,&pPersAlpha);
                              pPers=Tri(pPers,pcur,ptemp);
                              fread(&pPersAlpha,sizeof(PersonnesSave),1,fp);
                          }
                          fclose(fp);
                      }
                      return pPers;
                  }
                  
                  short Menu()
                  {
                      short ch;
                      do
                      {
                          printf ("Veuillez encoder votre choix : \n");
                          printf ("\t(1) Ajouter un acteur\n");
                          printf ("\t(2) Supprimer une acteur\n");
                          printf ("\t(3) Afficher les acteurs\n");
                          printf ("\t(4) Sauver dans le fichier\n");
                          printf ("\t(0) Quitter\n");
                          scanf ("%hd", &ch);
                      } while (ch < 0 || ch > 4);
                      return ch;
                  }
                  Personnes * AppelChoix (Personnes*pPersAlpha,short c)
                  {
                      switch (c)
                      {
                          case 1 :
                              pPersAlpha=Ajout (pPersAlpha);
                              break;
                          case 2 :
                              pPersAlpha=Suppression (pPersAlpha);
                              break;
                          case 3 :
                              Affichage (pPersAlpha);
                              break;
                          case 4 :
                              Sauve(pPersAlpha);
                              break;
                      }
                      return pPersAlpha;
                  }
                  Personnes * Ajout(Personnes*pPers)
                  {
                      Personnes *pcur,*ptemp;
                      pcur=pPers;
                      ptemp = (Personnes *) malloc (sizeof(Personnes));
                      if(ptemp==NULL)
                          printf("Liste vide");
                      else
                      {
                          printf("\n Encodez le nom : ");
                          LireNomPropre(ptemp->nom,30);
                          printf("\n Encodez le prenom : ");
                          LireNomPropre(ptemp->prenom,30);
                          printf("\n Encodez le titre : ");
                          LireNomPropre(ptemp->titre,130);
                      }
                      pPers=Tri(pPers,pcur,ptemp);
                      return pPers;
                  }
                  
                  void Sauve(Personnes *pPers)
                  {
                      FILE *fp;
                      PersonnesSave pPersSave;
                      if(pPers==NULL)
                          printf("\n Aucune personne encode.\n");
                      else
                      {
                          fp=fopen(FICHIER,"wb");
                          if(fp!=NULL)
                          {
                              while(pPers != NULL)
                              {
                                  strcpy(pPersSave.nom,pPers->nom);
                                  strcpy(pPersSave.prenom,pPers->prenom);
                                  strcpy(pPersSave.titre,pPers->titre);              
                                  fwrite(&pPersSave,sizeof(PersonnesSave),1,fp);
                                  pPers=pPers->svt;
                              }
                              fclose(fp);
                          }
                      }
                  }
                  void Affichage(Personnes *pPers)
                  {
                      if(pPers==NULL)
                          printf("\n Aucune personne\n");
                      else
                      {
                          while(pPers!=NULL)
                          {
                              printf("\n Nom : %s ", pPers->nom);
                              printf("\n Prenom : %s ", pPers->prenom);
                              printf("\n Titre : %s ", pPers->titre);
                              printf("\n ________________________________ \n");
                              pPers=pPers->svt;
                          }
                      }
                  }


                  Bien à vous

                  Kallidus



                  • Partager sur Facebook
                  • Partager sur Twitter

                  Récupération de données d'un fichier binaire

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown