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 :

Récuperation d'un fichier texte sour la forme tableau de char*


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par défaut Récuperation d'un fichier texte sour la forme tableau de char*
    Bonjour,
    Comme indiqué dans l'intitulé, j'essaye de récupérer un texte provenant d'un fichier ligne par ligne et stocker les lignes dans un tableau de char*.
    La compilation s'effectue sans problème, mais voici ce que j'obtiens quand j'essaye d'exécuter :

    1;2 //
    2;3 // cela marche bien pour les deux premières lignes mais après :

    *** Error in `./a.out': double free or corruption (fasttop): 0x0000000001e682c0 ***
    ======= Backtrace: =========
    /lib64/libc.so.6(+0x7c8dc)[0x7fa1399ae8dc]
    /lib64/libc.so.6(+0x87789)[0x7fa1399b9789]
    /lib64/libc.so.6(cfree+0x16e)[0x7fa1399bf0ee]
    ./a.out[0x40081d]
    ./a.out[0x40088e]
    /lib64/libc.so.6(__libc_start_main+0xea)[0x7fa13995250a]
    ./a.out[0x40067a] [...]


    voici mon code si vous voulez bien jeter un coup d'oeil...
    d'avance merci !
    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
     
    char **create_tmp(char *str, int line)
    {
            FILE *file;
            char **data;
            char *buf;
            size_t size;
            int i = 0;
            int j = 0;
     
    //      is_empty(str);                                                                                 
            file = fopen(str, "r");
            data = malloc(sizeof(char *) * (line + 1));
            if (data = NULL)
                    return(NULL);
    	while (i < line) {
         		buf = NULL;
                    j = getline(&buf, &size, file);
    	        if ( j == -1)
    		        return(NULL);
                    data[i] = malloc(sizeof(char) * (strlen(buf) + 1));
                    if (data[i] == NULL)
                          return(NULL);
    		strcpy(data[i], buf);
                    data[i][strlen(buf) - 1] = '\0';
    	        i++;
            }
            data[i] = NULL;
            fclose(file);
            return(data);
    }
     
    int main(int ac, char **av)
    {
            char **tmp = NULL;
     
            tmp = create_tmp(av[1], 13);
    }
    Valgrind me dit que le problème vient du malloc ligne 19
    PS : désolé je suis nouveau sur le forum ^^

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Il faut utiliser les balises pour insérer du code (le bouton [#]) sinon c'est illisible.
    Il y a des erreurs d'allocations/libérations de mémoire, des fonctions manquent il y en a certainement dedans.
    Il y a utilisation d'un buffer libéré ligne ???? et utilisé immédiatement après en faisant my_putstr(buffer); ligne ????.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par défaut
    Bonsoir,
    tout d'abord merci de m'avoir répondu, j'ai essayé de baliser le texte mais je ne trouve pas le résultat plus lisible ^^
    Sinon toutes les fonctions sont là, j'ai enlevé le putstr que j'avais placé pour débug.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Parmi les boutons au dessus de la fenêtre de saisie, c'est celui avec un # dessiné.

    En effet, le nouveau code n'utilise plus la fonction my_strdup().
    Ligne 15#, si buf est NULL, il ne faut normalement pas appeler free()
    Ligne 16#, si on veut que getline() alloue la mémoire, il faut avoir mis NULL dans buf juste avant.
    Ligne 18# et #21, attention aux return, le fclose() du fichier est perdu dans ces cas.
    Le dernier buffer alloué par getline() n'est jamais libéré.

    Je ne vois pas de problème ligne 19#, mais Valgrind est certainement plus fiable que moi.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par défaut
    Fait ! effectivement c'est plus lisible maintenant
    Je prends note de tes commentaires mais ceux-ci ne semblent pas résoudre le problème, valgrind pointe vraiment du doigt l'allocation data[i]

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    if (data = NULL)

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/03/2015, 09h42
  2. Réponses: 13
    Dernier message: 02/08/2008, 18h41
  3. Générer un fichier texte à partir d'un tableau Excel
    Par findev dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2008, 21h50
  4. Réponses: 2
    Dernier message: 10/09/2007, 19h03
  5. Réponses: 6
    Dernier message: 15/12/2006, 19h29

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