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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    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 émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    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 actif
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Points : 204
    Points
    204
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    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 actif
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Points : 204
    Points
    204
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    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.

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    En gros tu ne veux pas qu'on t'aide, tu veux qu'on fasse … ce n'est pas la politique de la maison.
    Tu as à ta disposition deux squelettes, pas un mais deux. Il va falloir un peu comprendre ce que tu veux faire quand même. Tu sais manipuler des listes chaînées ?
    Si la réponse est oui alors tu n'as qu'a remplir les primitives d'accès comme ajouterDebut qui insère un élément en tête ou supprimerDebut qui supprime l'élément en tête de liste.
    En revanche si la réponse est non, commence par lire un cours qui explique les listes chaînées et comment on les manipule, parce que là ce n'est pas la peine d'essayer d'en créer une à partir d'un fichier si tu ne sais pas en créer une tout court.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    Je demande pas que l'on fasse le programme à ma place, je demande juste par rapport à la fonction "loadFile_Liste_Acteur(const char* filename)" ce que je doit mettre dans le main.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Que voudrais-tu y mettre?
    Pourquoi?

    Fais-nous une proposition. (cf l'article IV-N de la charte.)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    ben juste l’appelée pour que l' on charge les données de mon fichier.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main()
    { 
    loadFile_Liste_Acteur();
    }

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Raté.

    la fonction prend un argument, il vaut lui en donner la valeur.
    la fonction retourne une valeur, il faut la récupérer.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    main()
    { 
    ListeActeur * p;
    fp=fopen("acteurs.txt","rb");
    p=loadFile_Liste_Acteur(fp);
    }

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    et que te dis ton compilateur?

    pour moi, il y a au minimum un warning et deux erreurs (variable non déclarée, conversion étrange)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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