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 :

pointeurs sur les fichiers


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut pointeurs sur les fichiers
    Bonjour,
    Voici l'énoncé de mon TP :

    Définir la fonction dictionnaire index(FILE *dico_fich) qui lit le fichier dico_fich et retourne me dictionnaire des mots.

    Mon problème est que j'ai une Erreur de segmentation que je n'arrive pas à résoudre..
    Pourriez vous m'aider ?

    Voici mon code :
    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
     
    typedef struct MOT {
        char *mot1;
        unsigned long position;
    } *mot;
     
    typedef struct DICTIONNAIRE {
        //struct MOT *mot2;
        mot *dico;
        int nombre;
    } *dictionnaire;
     
    dictionnaire index2(FILE *dico_fich) {
        dictionnaire d;
        int i,h = 0;
        char *ligne = (char*) malloc(TAILLE_MAX*sizeof(char));
        while (fgets(ligne, TAILLE_MAX, dico_fich)) {  
            i++;
        }
        d->nombre = i; 
        d->dico = (mot*) malloc(i*sizeof(mot));
        h = fseek(dico_fich, 0, SEEK_SET);
        int j = 0;
        while (fgets(ligne, TAILLE_MAX, dico_fich)) {  
            d->dico[j]->mot1 = strtok(ligne, " ");
            d->dico[j]->position = j;
            j++;
        }
        return d;
    }
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    il faut allouer de la mémoire à d ...

  3. #3
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    Je viens donc de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dictionnaire d = (dictionnaire) malloc(sizeof(dictionnaire));
    mais toujours une erreur de segmentation

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Oui car la taille est celle de ta structure pas de ton pointeur. Le plus simple pour l'allocation est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dictionnaire d=malloc(sizeof(*d))
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dictionnaire d=malloc(sizeof(struct DICTIONNAIRE))
    Remarque dico est de type pointeur -> il faudra aussi alouer de la mémoire ...
    Tu as vu ça en cours.
    Je ne peux que te conseiller d'écrire des fonction d'allocation et de libération ; par exemple :

    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
     
    mot new_mot(char* mot1, unsigned long int position)
    {
       mot m=malloc(sizeof(*m));
      if (m==NULL) {
        // une erreur à gérer
      } else {
        m->mot1=mot1; // ou m->mot1=strdup(mot1)
        m->position=position;
        return m;
      }
    }
     
    void free_mot(mot* pm)
    {
      if ((pm==NULL)||(*pm==NULL)) {
        // dépend de ce que tuveux faire, peut ne pas être une erreur
      } else {
        if ((*pm)->mot1!=NULL)
          free((*pm)->mot1); // à faire ou pas suivant ta gestion des chaines
        free(*pm);
        *pm=NULL;
      }
    }
    EDIT: écrit à la volée peut contenir des erreurs ....

  5. #5
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Salut,
    Citation Envoyé par pandora19 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct MOT {
        char *mot1;
        unsigned long position;
    } *mot;
     
    typedef struct DICTIONNAIRE {
        //struct MOT *mot2;
        mot *dico;
        int nombre;
    } *dictionnaire;
    C'est une très mauvaise idée de définir des types comme pointeur, on ne voit plus dans le code que ce sont des pointeurs.
    Par exemple le champ dico de la structure DICTIONNAIRE est en réalité un pointeur de pointeur de MOT (struct MOT **) Est-ce vraiment ce que tu voulais ?

  6. #6
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    Oui car dico est un tableau dynamique de mots

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Tu as vu tes autres erreurs ?

  8. #8
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    Non pas vraiment..

  9. #9
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    je suppose que le fichier que tu lis contient en fait un mot par ligne ?

  10. #10
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    oui du type :
    Mot1 definition1
    Mot2 definition2
    Mot3 definition3
    ....

  11. #11
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Ton algo pour la lecture est correct (pas forcément optimisé mais ce n'est pas le plus important pour l'instant) :
    * tu lis tout le fichier pour savoir combien il y a de mots
    * tu crées ta structure pouvant contenir ce nombre de mots
    * tu te replaces au début du fichier et tu remplis ta structure

    As-tu écrit les fonctions d'allocation et de libération ?
    Je te suggère d'utiliser la version avec strdup pour créer un mot. Si tu ne dupliques pas la chaine que strtok te renvoie celle-ci sera réutilisée pour les autres appels. De plus tu as alloué de l'espace à ligne dans index2 sans le libérer.

  12. #12
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    D'accord,
    strdup s'utilise à la place de strtok donc ?

  13. #13
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Non, strtok tokenise ta chaine, i.e. il te renvoie la chaine par morceau suivant les séparateurs que tu lui as donné. Le problème avec strtok est que cette fonction utilise la chaine que tu lui donnes et la modifie. Si tu utilises une variable (ici ligne) plusieurs fois avec strtok les résultats consécutifs vont se détruire. L'idée est donc de copier le résultat (strdup réserve de la mémoire pour toi, copie la chaine passée en argument et te renvoie un pointeur sur cette copie) pour le stocker dans ta structure. N'oublie pas de libérer les espaces alloués avec free

  14. #14
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    Salut, j'ai toujours l'erreur de segmentation, je ne sais pas comment m'en débarrasser

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par pandora19 Voir le message
    Salut, j'ai toujours l'erreur de segmentation, je ne sais pas comment m'en débarrasser
    Avant toute chose, est-ce que tu sais ce qu'est une erreur de segmentation ? Parce que comprendre ce qui se passe t'aiderait à chercher au bon endroit…

  16. #16
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 33
    Par défaut
    Oui je sais ce que ça veut dire, il s'agit d'un accès à un emplacement non alloué..

    C'est dans le fgets qu'il y a cette erreur mais je ne sais pas comment résoudre ça !

  17. #17
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Je vois deux fgets() dans le programme que tu nous as donné au départ. Par contre, je ne sais pas où tu définis TAILLE_MAX.

    Si c'est vraiment fgets() qui fait planter ton programme, alors il n'y a que trois paramètres : « ligne », « TAILLE_MAX » et « dico_fich ». Que valent chacun d'eux, à l'exécution ?

Discussions similaires

  1. Questions sur les fichiers Ressource .RC .RES
    Par dexterz dans le forum Langage
    Réponses: 10
    Dernier message: 01/08/2005, 10h15
  2. Réponses: 3
    Dernier message: 28/10/2004, 08h39
  3. Commande en shell -- Sur les fichiers
    Par OrangeBud dans le forum Linux
    Réponses: 8
    Dernier message: 18/05/2004, 13h13
  4. [C#] Authentification sur les fichiers Pdf
    Par ensisoft dans le forum ASP.NET
    Réponses: 14
    Dernier message: 04/05/2004, 12h10
  5. Réponses: 6
    Dernier message: 28/04/2004, 10h41

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