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 :

Explication sur la construction d'une liste linéaire à partir d'un fichier binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Par défaut Explication sur la construction d'une liste linéaire à partir d'un fichier binaire
    Bonjour,
    Comme écrit dans l'intitulé, je cherche de l'aide à comment créer une liste linéaire à partir d'un fichier binaire.

    Voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _Acteurs
    {
        char nom[30];
        char prenom[30];
        char titre[120];
        long suivant;
    }Acteurs;
    Voici pour vérifier si le fichier existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FILE* fp;
    fp = fopen(FICHIER,"rb");
        if (fp == NULL)
        {
            fp = fopen(FICHIER,"ab");
            if(fp==NULL)
                perror("Erreur a l'ouverture");
            fclose(fp);
        }
    Mais comment créer ma liste linéaire?

    Je dois reprendre les données de mon fichier mais je ne sais pas quoi mettre comme code et où.

    Merci de votre aide.

    Kallidus

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    tout d'abord passons ton type en revue. J'imagine que tu cherches à faire une liste chaînée, non ? Dans ce cas ta structure devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _Acteurs
    {
        char nom[30];
        char prenom[30];
        char titre[120];
        struct _Acteurs *suivant;
    }Acteurs;
    Comme tu crées un nouveau type, il est conseillé de créer les fonctions qui vont manipuler ce type :
    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
    //acteur_new est une fonction qui crée un nouveau maillon
    // je pars du principe que si l'allocation mémoire échoue alors il y a un abort
    // c'est un maillon qui n'est relié à rien
    Acteurs *acteur_new(const char nom[], const char prenom[], const char titre[]);
     
    // si on a aune fonction d'allocation alors on a une fonction de libération
    void acteur_free(Acteurs *);
     
    // ici tu ajoutes une flopée de fonctions qui vont bien
    ....
     
    // on passe aux fonctions manipulant une liste
    // je ne crée pas de type dédié
    Acteurs *acteur_insert(Acteurs *head, Acteurs *new);
     
    // à nouveau une flopée de fonctions pour la gestion des listes
    ....
    Maintenant qu'on sait manipuler des objets de type Acteurs* et des liste d'Acteurs on passe à la lecture du fichier.

    Il nous faut une fonction qui lise le fichier et en extrait les données, elle renvoie un booléen qui indique le succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool file_read_acteur_data(FILE * file, char nom[], char prenom[], char titre[]);
    Avec toute ces fonctions il devient presque trivial d'implémenter ce que tu cherches :
    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
    Acteurs *file_create_actor_list(const char *filename)
    {
      FILE *file=fopen(filename,"r");
      if (file==NULL) {
        perror("fopen");
        return NULL;
      }
     
      char nom[30];
      char prenom[30];
      char titre[20];
      Acteurs *list=NULL;
     
      while (file_read_acteur_data(file, nom, prenom, titre)) {
        Acteurs *new=acteur_new(nom, prenom, titre);
        list=acteur_list_insert(list, new);
      }
     
      fclose(file);
      return list;
    }
    Tu as le squelette, reste à écrire le fond du code.

  3. #3
    Membre éclairé
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Par défaut
    Je conseillerai de séparer la data de la structure de donnée.
    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
     
    typedef struct Acteur Acteur;
    struct Acteur
    {
      char nom[30];
      char prenom[30];
      char titre[120];//???
    };
     
    typedef struct Liste_Acteur Liste_Acteur;
    struct Liste_Acteur
    {
      Acteur ActeurInfo;//la data
      Liste_Acteur *suivant;
    };
    Mais la structure acteur me semble curieuse (un acteur ne possède qu'un titre ?)
    En séparant on permet qu'un acteur n'est pas une information sur un autre acteur.
    (et ainsi d'être libre quand à la manière de hiérarchiser l'information. tableau ? liste ? arbre ? etc... )

    ainsi tu peux créer des fonction pour la gestion de la liste et des fonction de gestion des Acteurs.
    Pour le reste je rejoins ce qui t'a été dit pas picodev

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Par défaut
    Merci de vos réponses mais ma question était "Quel est le code pour reprendre les données de mon fichier binaire et les placer dans ma liste chainée ?".

    Bien à vous.

    Kallidus

  5. #5
    Membre éclairé
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Par défaut
    Et bien justement, en séparant les donné et ta liste,il est plus simple de lire le fichier en binaire !

    dans ton fichier binaire : {acteur1}{acteur2}...
    où chaque bloc mesure sizeof(Acteur) (car tu as une taille statique pour tes tableaux.

    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
     
    Liste_Acteur* loadFile_Liste_Acteur(const char* filename)
    {
     Liste_Acteur liste=NULL;//en cas d'erreur on renvoie NULL
     FILE* file=fopen(filename,"rb");//ouverture en lecture bianaire
     size_t encore;
     if(file!=NULL)
     {
      do
      {
       ajouterDebut(&liste);//sans initialiser Acteur
       encore=fread(&liste->acteurInfo,sizeof(Acteur),1,file);
      }while(encore);
     //fin lecture du fichier et le premier élément n'est pas bien initialisé.
      supprimerDebut(&liste);
      fclose(file);
     }
     return liste;
    }
    Du coup on s'en sort pas trop mal !

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Par défaut
    Ok. Et donc dans la fonction main, je mets quoi pour la fonction "loadFile_Liste_Acteur(const char* filename)" ?

    et la fonction ajouterDebut c'est l'initialisation?

    et pour l'autre fonction supprimerDebut, on mets quoi dedans.

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/06/2011, 17h19
  2. Réponses: 5
    Dernier message: 29/06/2009, 11h57
  3. faire une liste a partir de deux fichiers txt
    Par finelady dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/04/2008, 10h39
  4. Remplir une liste dynamiquement à partir d'un fichier PHP
    Par titoff85 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/08/2007, 20h57
  5. [XSLT] Générer une liste déroulante à partir d'un fichier xml ?
    Par chipster45 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 30/03/2007, 09h59

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