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

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Maroc

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Points : 36
    Points
    36
    Par défaut recuperer les données stockées dans un fichier et les mettre dans un tableau de structure de données
    Bonjour
    je travaille sur un programme ou je dois récupérer les données stockées dans un fichier et les mettre dans un tableau de structure de données , les données sont séparées par des ";" ,j'ai essayé d'utiliser la fonction strtok mais le compilateur renvoie beaucoup d'erreurs ! voila la fonction :

    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
     
          Client* Readfille(char *filename) // la fonction envoie un tableau de type client
          { char line[200];// c ici ou on vas recuperer une line de fichier.
           Client *client1;//Client est une strocture de données
          FILE *pf;
          int i=0;
          pf = fopen (filename,"r");//on ouvre le fichier en mode lecture 
          if(pf==NULL) printf("fichier non trouvé");
          else
            while (!eof(pf))
          { fgts(line,100,pf);
            (client1+i)->nc=strtok(line,";");//nc c'est un champs de structure client "numero de client"
            while(strtok(line,";")!=NULL)
            {
             (client1+i)->nom=strtok(NULL,";");// c'est ici ou tt les prblm commence!!
             (client1+i)->prenom =strtok(NULL,";");
             (client1+i)->adr=strtok(NULL,";");
             (client1+i)->tel=strtok(NULL,";");
             (client1+i)->code=strtok(NULL,";");
             (client1+i)->N_carte=strtok(NULL,";");
             (client1+i)->capital=strtok(NULL,";");
            }
          i++;};
          };
    Je sais que peut être j'ai fait des fautes stupides alors excusez ma stupidité .
    Merci d'avance

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 338
    Points
    2 338
    Par défaut
    Bonjour,


    Si le compilateur te renvoie beaucoup d'erreur, autant les mettre ici.

    A froid, je dirais cela :

    * mauvaise syntaxe de while

    il faut faire comme ceci :

    Le ';' en plus, c'est pour do while :



    Idem pour la fonction, pas de ';' a la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Client* Readfille(char *filename)
    {
    }
    Ta fonction est censé renvoyer un tableau unidimentionnel de client, or il n'y a pas de return, ca va etre dur ...


    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
     
     
    Client* Readfille(char *filename) // la fonction envoie un tableau de type client
    { 
     
        Client *client1;//Client est une strocture de données
     
                 (client1+i)->nom=strtok(NULL,";");// c'est ici ou tt les prblm commence!!
                 (client1+i)->prenom =strtok(NULL,";");
                 (client1+i)->adr=strtok(NULL,";");
                 (client1+i)->tel=strtok(NULL,";");
                 (client1+i)->code=strtok(NULL,";");
                 (client1+i)->N_carte=strtok(NULL,";");
                 (client1+i)->capital=strtok(NULL,";");
            }
    Tu utilise client1 alors que celui pointe sur NULL, il faut faire de l'alloccation dynamique avec malloc.

    De plus, une bonne habitude a prendre est de toujours initialisé ses pointeur a NULL. Ainsi, il est plus facile de voir combien de pointeur invalide tu possede au debut.

    **
    Une petite astuce pour reduire le nombre de ligne sans vraiment obfusqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        pf = fopen (filename,"r");//on ouvre le fichier en mode lecture 
        if (pf==NULL)
    peut s'ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if ((pf = fopen (filename,"r")) == NULL)


    ** N'utilise pas -> pour client1.

    Il y a effectivement un pointeur, mais celui-ci pointe vers le tableau qui contient des client, et non des pointeur vers client.


    (client1+i)->

    devient donc

    client1[i].


    Je trouve les crochet plus explicite et plus lisible, mais ce sont mes gout, libre a toi de faire


    (client1+i).

    Si tu le veux




    Après, je n'utilise pas strtok et je n'ai pas l'habitude d'utiliser des fichier, donc je ne sais pas si ce que tu as fait est bon.

    Je t'invite a regarder la FAQ si besoins est.

    Le code corrige sans le malloc :

    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
     
    Client* Readfille(char *filename) // la fonction envoie un tableau de type client
    { 
        Client *client1 = NULL;//Client est une structure de données
        FILE *pf = NULL;
     
     
        if ((pf = fopen (filename,"r"))==NULL)
            printf("fichier non trouvé");
        else
        {
            int i=0;
            char line[200];
     
            /* Faire un Malloc sur client au bon nombre de client */
     
            while (!eof(pf))
            { 
                fgts(line,100,pf);
                client1[i].nc=strtok(line,";");//nc c'est un champs de structure client "numero de client"
                while(strtok(line,";")!=NULL)
                {
                     client1[i].nom=strtok(NULL,";");
                     client1[i].prenom =strtok(NULL,";");
                     client1[i].adr=strtok(NULL,";");
                     client1[i].tel=strtok(NULL,";");
                     client1[i].code=strtok(NULL,";");
                     client1[i].N_carte=strtok(NULL,";");
                     client1[i].capital=strtok(NULL,";");
                }
                i++;
            }
        }
     
        return client1;
    };

    Ah oui :

    Citation Envoyé par saloua2200 Voir le message
    Je sais que peut être j'ai fait des fautes stupides alors excusez ma stupidité .
    Merci d'avance
    Tu est ici sur un forum pour debutant en C. On a tous été debutant un jour, on a certainement fait pire.
    Ce qui serai stupide, ce serai de vouloir une reponse toute faite sans vouloir faire d'effort.

    Tu es ici au bon endroit, bienvenue sur developpez

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Bonjour et bienvenue sur le forum.

    Quelques remarques :
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         while (!eof(pf))
         {
            fgts(line,100,pf);
            ....
    est une mauvaise utilisation de feof(). Utilise plutôt la forme (et se souvenir que fgets() met le '\n' dans la chaîne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         while (fgts(line,100,pf)!=NULL)
         {....
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       (client1+i)->nc=strtok(line,";");//nc c'est un champs de structure client "numero de client"
    client1 est un client * non initialisé. Ceci va planter.
    D'autre part, l'écriture client1+i montre que tu souhaiterais que client1 pointe un tableau de client. Ce tableau n'est pas créé. La fonction doit donc créer ce tableau par allocation dynamique pour pouvoir le retourner en sortie de fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    client1 = malloc(..??..*sizeof *client1);// que vais-je mettre comme nombre de clients ?
    if(client1 != NULL)
    { ....
    }
    return client1;
    -
    strtok va te renvoyer un pointeur sur un élément de line (ou NULL). Ton code stocke ces pointeurs dans les structures. Il faut voir que line est commun à toutes les lignes lues. Au final, TOUS ces pointeurs pointent sur des éléments de line qui contiendra au final la DERNIERE ligne lue et les données précédentes seront perdues. De plus line, une variable locale, est détruite en sortie de fonction. En sortant de la fonction, tous ces pointeurs pointeront vers une zone détruite !
    Il faut donc stocker les chaînes, pas simplement leur adresse, donc avoir un tableau de char. Cela peut se faire aussi par allocation dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      p = strtok(line,";");
      client1[i].nc = malloc(strlen(p)+1);
      if(client1[i].nc != NULL) strcpy(client1[i].nc,p);
      else { //plus de mémoire disponible}
    ....

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Maroc

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 29
    Points : 36
    Points
    36
    Par défaut Merci
    Merci beacoup SofEvans et diogene Vous m'avez enorement aidé le programme marche trés bien maintenant !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/04/2011, 04h46
  2. récupéré une ligne dans un fichier txt pour mettre dans msgbox
    Par fabrice44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 14h01
  3. Réponses: 24
    Dernier message: 25/09/2007, 11h53
  4. Réponses: 2
    Dernier message: 22/02/2007, 19h28
  5. Réponses: 12
    Dernier message: 21/02/2007, 09h44

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