IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

structure recursive et fichier


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut structure recursive et fichier
    Bonjour,

    J'enregistre dans un fichier une liste chainee d'elements.
    J'écris dans le fichier élément par élément, cela se passe bien.

    Voici de quoi se compose ma liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct car
    {
      personne pers; //personne est une structure
      struct car *suivant;
    };
     
    typedef struct car carnet;
    typedef carnet *liste;
    Le code pour charger une liste a partir de mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    liste car;
      liste temp, suivant;
      FILE *pf;
     
      pf=fopen("carnet.dat", "r");
     
      if(pf != NULL)
        {
          car = (liste) malloc(sizeof(carnet));
          fread(&car->pers, sizeof(carnet), 1, pf);
          temp=car;
     
          while(!feof(pf))
    	{
    	  suivant = (liste) malloc(sizeof(carnet));
    	  fread(&suivant->pers, sizeof(carnet), 1, pf);
    	  temp->suivant = suivant;
    	  temp = suivant;
    	}
        }
     
      fclose(pf);
    Voila mon probleme : Ca marche bien (bon ce n'est pas ca mon probleme ) sauf que j'ai toujours un maillon de trop, par exemple si j'ai 5 personnes dans ma liste, j'ai bien mes 5 personnes avec le chainage qui va bien, mais j'ai toujours une personne en plus en fin de liste qui a des valeurs vides (valeurs de la structure personne).

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Tu initialises pas ton pointeur suivant correctement...

    Déjà,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fread(&suivant->pers, sizeof(carnet), 1, pf);
    devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fread(&suivant->pers, sizeof(suivant->pers), 1, pf);
    Le problème, c'est que tu ne mets pas systèmatiquement le pointeur à jour lorsque tu le lis ton fichier, une meilleure solution est de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    liste lireficher()
    {
    liste car=NULL;
    liste temp, suivant;
    FILE *pf;
     
      pf=fopen("carnet.dat", "r");
     
      if(pf != NULL)
        {
          //On lit le premier élément, on suppose que le fichier a au moins un élément
          car = (liste) malloc(sizeof(carnet));
          //On test toujours après un malloc
          if(car == NULL)
              return NULL;
     
          //C'est toujours mieux de tester le retour des fonctions...
          if(fread(&car->pers, sizeof(car->pers), 1, pf) != sizeof(car->pers))
                {
                free(car);
                return NULL;
                }
     
          car->suivant = NULL;
          temp=car;
     
          while(!feof(pf))
         {
          //A titre d'exercice, je laisse le test du malloc et le retour du fread... il faudra
          //libérer la liste crée s'il y a un problème
          suivant = (liste) malloc(sizeof(carnet));
     
         //on récupére l'info sur la personne
         fread(&suivant->pers, sizeof(suivant->pers), 1, pf);
     
         //on met le pointeur à null
         suivant->suivant  = NULL;
     
         //on fait le lien
         temp->suivant = suivant;
         temp = suivant;
         }
        }
     
      fclose(pf);
     
    return car;
    }
    Jc

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut
    Merci pour ton aide Jc

    J'ai cependant 2 problemes :
    -Je rentre dans le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(fread(&car->pers, sizeof(car->pers), 1, pf) != sizeof(carnet))
    -Je n'arrive a voir que les valeurs de la premiere personne
    -Et j'ai toujours une personne en plus

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code corrigé, le test était faux... Désolé...

    Hmm, bizarre, montre le code de création de la liste et le code qui créé le fichier...

    Jc

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void Enregistrer(liste car)
    {
     
      FILE *pf;
      liste temp = car;
     
      pf=fopen("carnet.dat", "w");
     
      if(pf != NULL)
        {
          while(temp != NULL)
    	{
    	  fwrite(&temp->pers, sizeof(temp->pers), 1, pf);
    	  temp = temp->suivant;
    	}
        }
     
      fclose(pf);
     
    }
    Pour initialiser, je fais juste des scanf pour le moment pour tester, par exemple scanf("%s", temp->pers.valeur1);

    Après avoir retiré le test, rebranché mon cerveau, le gros du changement venait de à transformer en et d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    suivant->suivant = NULL;

Discussions similaires

  1. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30
  2. [XP] structure d'un fichier UDF ?
    Par sali dans le forum Windows XP
    Réponses: 1
    Dernier message: 16/02/2006, 09h24
  3. structure d'un fichier c'est quoi
    Par ilyassou dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 09/09/2005, 21h00
  4. structure d'un fichier .ttf
    Par OutOfRange dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 22/08/2005, 12h52
  5. Problème de rangement de structure dans un fichier ...
    Par Freeze dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/12/2003, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo