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 :

Remplissage d'un tableau 2D avec des char*


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Remplissage d'un tableau 2D avec des char*
    Bonjour,

    Je vous explique le contexte : je souhaite récupérer des informations dans un fichier, et les enregistrer dans un tableau 2D. Chaque ligne de mon fichier est constituée de 3 informations, séparées les unes des autres par des tabulations.

    J'ai donc écrit le code suivant :
    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
    char *** recupInfosFichier (char * nomFichier, int nbLignesRecup) {
        int i;
     
        // Allocation de la mémoire
        char *** tab = (char***) malloc (nbLignesRecup * sizeof(char**));
        for (i = 0; i < nbLignesRecup; i++) {
            tab[i] = (char**) malloc (3 * sizeof (char*));
        }
     
        // Ouverture et lecture du fichier
        FILE* fich = NULL;
        fich = fopen(nomFichier,"r");
     
        if (fich == NULL) {
            printf("Impossible d'ouvrir le fichier %s\n", nomFichier);
            return NULL;
        }
     
        char ligne[500] = "";
     
        i = 0;
        int j;
        char * str;
        while (i < nbLignesRecup && fgets(ligne,500,fich) != NULL) {
     
            for (j = 0, str = ligne; j < 3; j++, str = NULL) {
                tab[i][j] = strtok(str,"\t"); // Séparation des informations
                printf("i:%d j:%d %s\n",i,j, tab[i][j]);
            }
            i++;
        }
     
         printf("\nRESULTAT\n");
        for (i=0; i < nbLignesRecup; i++) {
            for (j=0; j < 3; j++) {
                printf("%s\n ", tab[i][j]);
            }
        }
     
        fclose(fich);
     
        return tab;
    }
    Mon problème est le suivant : lorsque je vérifie la valeur de mon tab[i][j] après le strtok, celui-ci contient bien l'information récupérée dans le fichier. Par contre, après la fin de la boucle while, lorsque je parcours de nouveau mon tableau, j'ai l'impression que les informations ont été "écrasées" et se chevauchent.
    Plus exactement, j'obtiens le résultat suivant :
    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
    i:0 j:0 RMC
    i:0 j:1 http://vipicecast.yacast.net/rmc
    i:0 j:2 http://www.logotheque.fr/6396-2/logo+RMC+INFO.jpg
     
    i:1 j:0 Radio FG
    i:1 j:1 http://radiofg.impek.com/fg6.mp3
    i:1 j:2 http://upload.wikimedia.org/wikipedia/commons/1/14/Ectac.FG-Dj-Radio-logo.03.jpeg
     
    i:2 j:0 France Info
    i:2 j:1 http://mp3.live.tv-radio.com/franceinfo/all/franceinfo.mp3
    i:2 j:2 http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/France_Info.png/120px-France_Info.png
     
    i:3 j:0 Nostalgie
    i:3 j:1 http://mp3.live.tv-radio.com/nostalgie/all/nos_113812.mp3
    i:3 j:2 http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Nostalgie_logo_simple.png/120px-Nostalgie_logo_simple.png
     
     
    RESULTAT
     
    Nostalgie
     algie
     m/nostalgie/all/nos_113812.mp3
     Nostalgie
     
     talgie/all/nos_113812.mp3
     Nostalgie
     tp://mp3.live.tv-radio.com/nostalgie/all/nos_113812.mp3
     p://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Nostalgie_logo_simple.png/120px-Nostalgie_logo_simple.png
     
     Nostalgie
     http://mp3.live.tv-radio.com/nostalgie/all/nos_113812.mp3
     http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Nostalgie_logo_simple.png/120px-Nostalgie_logo_simple.png
    J'ai essayé d'effectuer un malloc sur chaque tab[i][j] pensant que le problème venait de là, mais ça n'a rien changé.
    Ayant quelques difficultés avec les problèmes de mémoire et pointeurs, je ne sais pas d'où cela peut venir...

    Merci par avance pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu utilises un tableau qui possède une adresse fixe : char ligne[500] = "";, chaque ligne est écrasée par la nouvelle, et cela pour chaque itération. Or tu fais pointer tab[i][j] à chaque fois sur un emplacement de ce tableau.
    Il te faut copier la chaine qui est retournée par strtok().

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    J'ai résolu le problème en faisant un strcpy du résultat de strtok directement dans mon tableau ; j'avais mal compris ce que renvoyait cette fonction.

    Merci pour ton aide !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Es-tu sûr qu'un tableau 2D de chaînes est approprié pour ça?
    On dirait qu'un tableau de structures { char* nom, char* url, char* image } ferait un meilleur boulot...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. remplissage d'un tableau 2D avec des commandes
    Par azdingue dans le forum LabVIEW
    Réponses: 0
    Dernier message: 14/05/2014, 08h38
  2. Réponses: 4
    Dernier message: 12/12/2007, 08h30
  3. un tableau multidimentionnel avec des variable de type different ?
    Par sebsmax dans le forum Collection et Stream
    Réponses: 25
    Dernier message: 18/01/2007, 14h30
  4. Réponses: 4
    Dernier message: 05/12/2006, 11h43
  5. Remplissage d'une forme gauche avec des rectangles
    Par Aiekick dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/03/2006, 19h00

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