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 :

Stocker un .txt dans un char**


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut Stocker un .txt dans un char**
    Bonjour,

    J'ai crée une fonction qui devrai retourner le contenu d'un .txt dans un char**.

    Le soucis que je rencontre c'est que ma fonction retourne un char** avec comme valeur la dernière ligne du fichier .txt pour chaque "cellule" alors que chaque "cellule" devraient retourner une ligne différente. Autrement dis, à chaque fois que le char** reçoit un nouveau char* (une ligne du fichier .txt), il écrase tout les char* précédent avec la valeur en cour.

    Il doit surement il y avoir un aspect dans l'utilisation des char** que j'ai mal compris. Pourriez vous m'aider.

    Voici ma fonction, elle affiche chaque ligne une fois stockées dans le char** puis affiche son contenu une fois que tout le texte à été parcouru, les saisies se font a la ligne 24 et 30. Mon erreur se trouve surement ici

    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
    44
    45
    46
    47
    48
    char** fOption()
    {
            char* elementsToFind[512] ;
            char* values_include = "c:\\test2.txt";
            FILE *fp;
            fp = fopen(values_include, "r");
     
            if( fp == NULL )
            {
                printf("f, unable to open the file : %s\n",values_include);
                exit (0);
            }
     
            else
            {
                int numLine = 1;
                char temp [512]= "";
                while(fgets(temp, 512, fp))
                {
     
                    if(strrchr(temp,'\n')) //all lines except the last one
                    {
                        temp[strlen(temp)-1] = '\0';
                        elementsToFind[numLine-1] = temp;
                        printf("TEST %d : %s\n",numLine,elementsToFind[numLine-1]);
                        numLine ++;
                    }
                    else //last line
                    {
                        elementsToFind[numLine-1] = temp;
                        printf("TEST %d : %s\n",numLine,elementsToFind[numLine-1]);
                        elementsToFind[numLine] = NULL;
                    }
                }
            }
            fclose(fp);
     
            int iterator = 0;
            printf("------\ncharr** Final : \n");
            while(elementsToFind[iterator] != NULL)
            {
                printf("==>%s\n",elementsToFind[iterator]);
                iterator++;
            }
            char** tempElementsToFind = elementsToFind;
            return tempElementsToFind;
     
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Pour copier une chaîne de caractère, il faut utiliser strcpy ou strncpy (plus sûr).

    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            char** tempElementsToFind = elementsToFind;
            return tempElementsToFind;
    Pourquoi ne pas directement faire :
    ?

    N'oublie pas que le pointeur retourné va pointé vers une variable locale donc à la fin de ta fonction, elle seront détruite et tu risques des erreurs de segmentations.

    Il faut alors utiliser malloc et free.

  3. #3
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pour copier une chaîne de caractère, il faut utiliser strcpy ou strncpy (plus sûr).
    strncpy n'a pas été réalisé pour la copie de chaînes de caractère. Ce n'est PAS une version plus sûre de strcpy.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Pour copier une chaîne de caractère, il faut utiliser strcpy ou strncpy (plus sûr).

    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            char** tempElementsToFind = elementsToFind;
            return tempElementsToFind;
    Pourquoi ne pas directement faire :
    ?

    N'oublie pas que le pointeur retourné va pointé vers une variable locale donc à la fin de ta fonction, elle seront détruite et tu risques des erreurs de segmentations.

    Il faut alors utiliser malloc et free.

    je retourne pas ElementsToFind; parce que c est un char *[512] et si j'essaye on m indique une erreur.

    Mais mon erreur ne se localise pas au niveau de ma copie comme tu le suggère puisque ce que j affiche avec printf est l élément d'origine et pas ce que je retourne

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    strncpy n'a pas été réalisé pour la copie de chaînes de caractère. Ce n'est PAS une version plus sûre de strcpy.
    Attention, je n'ai pas dit que strncpy était une version de strcpy mais qu'utiliser strncpy est plus sûr que strcpy.
    Il faut bien évidement ne pas oublier que si la chaîne source est trop grande, le '\0' final ne sera pas ajouté.

    Quelle erreur t'indique le compilateur?
    J'ai testé mais j'ai juste un Warning pour dire que la fonction retourne un pointeur sur une variable locale.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Quelle erreur t'indique le compilateur?
    Il m'indique le même warning que toi. Mais ne tenez pas compte de ceci, l erreur se fait des le printf soit avant le return.

    Lors de la boucle du printf ligne 42, seulement la dernière ligne de mon txt est affiché X fois, X étant le nombre de ligne de mon fichier

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Arnau6 Voir le message
    Il m'indique le même warning que toi. Mais ne tenez pas compte de ceci, l erreur se fait des le printf soit avant le return.

    Lors de la boucle du printf ligne 42, seulement la dernière ligne de mon txt est affiché X fois, X étant le nombre de ligne de mon fichier
    La réponse t'as déjà été donnée, il faut utiliser une fonction pour copier des chaînes de caractères et pas seulement faire une affectation avec temp.

    En effet, tu va juste copier l'adresse vers le premier caractère de temp or à chaque tour de boucle, tu modifies temp et comme toutes les lignes pointent vers le premier caractère de temp, toutes les lignes affichent la même chose.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Une fois la ligne 24 remplacé par : strcpy(elementsToFind[numLine-1],temp);
    La fonction plante des qu'il rencontre cette ligne modifiée alors que je compile sans erreur. C'est la même chose avec strncpy

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    C'est normal, il faut allouer l'espace où tu vas effectuer ta copie avec malloc().

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonsoir,

    C'est normal, il faut allouer l'espace où tu vas effectuer ta copie avec malloc().
    Maintenant j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if(strrchr(temp,'\n')) //all lines except the last one
                    {
                        temp[strlen(temp)-1] = '\0';
                        elementsToFind[numLine-1] = (char *) malloc(strlen(temp) * sizeof(char));
                        strcpy(elementsToFind[numLine-1],temp);
                        printf("TEST %d : %s\n",numLine,elementsToFind[numLine-1]);
                        numLine ++;
     
                    }
    Avec ce warning au niveau du malloc : 'elementsToFind' may be used uninitialized in this function [-Wuninitialized]|
    De plus le programme plante sur le malloc. Je ne suis pas encore a l'aise avec les malloc et les pointeurs. Pouvez vous me dire ou je fais fausse route ?

    Merci

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elementsToFind[numLine-1] = (char *) malloc(strlen(temp) * sizeof(char));
    Il faut aussi allouer l'espace pour le '\0' final donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char *) malloc(strlen(temp)+1);
    De plus la définition de sizeof est que sizeof(char) = 1.

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Le +1 ne change rien.

    J'ai changé mon code, Maintenant j'arrive a stocker tout les lignes dans un char[numLine][512] mais je n'arrive pas a le retourner correctement en tant que char**. Aucune erreur est retourné mais quand je veux afficher le contenu d'un char** elementsToFind = fOption();
    avec des printf, le programme plante

    Voici mon nouveau 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    char** fOption()
    {
        int numLine = 1;
        char count[512];
     
            char* values_include = "c:\\test.txt";
     
            FILE *fp;
            fp = fopen(values_include, "r");
     
            if( fp == NULL)
            {
                printf("f, unable to open the file : %s\n",values_include);
                exit (0);
            }
     
            else
            {
                while(fgets(count, 512, fp))
                {
                    numLine ++;
                }
            }
            fclose(fp);
     
     
            char temp[numLine-1][512];
            fp = fopen(values_include, "r");
            numLine = 1;
                while(fgets(temp[numLine-1], 512, fp))
                {
                    if(strrchr(temp[numLine-1],'\n')) //all lines except the last one
                    {
     
                        temp[numLine-1][strlen(temp[numLine-1])-1] = '\0';
                    }
                    //printf("%s\n",temp[numLine-1]);
                    numLine ++;
                }
            fclose(fp);
     
     
            int i;
            for(i=1; i< numLine-1; i++)
                printf("==>%s\n",temp[i]);
     
            char** isReturn = NULL;
            isReturn = (char**)temp;
            return isReturn;
    }

Discussions similaires

  1. Stocker une string dans un tableau de char à deux dimensions
    Par faitor1 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/03/2014, 02h12
  2. importer .txt dans une variable char
    Par Wulioh dans le forum MATLAB
    Réponses: 4
    Dernier message: 06/11/2010, 21h35
  3. Stocker contenu txt dans un JTexArea
    Par FstDsi dans le forum JDeveloper
    Réponses: 1
    Dernier message: 12/05/2008, 09h47
  4. Comment stocker du multimédia dans ma bdd?
    Par Invité dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 22/08/2003, 09h44
  5. Stocker un record dans un fichier
    Par ushu dans le forum Langage
    Réponses: 7
    Dernier message: 13/12/2002, 15h51

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