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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

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