Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec la fonction fgets

Sujet résolu
    19 février 2018 à 16:17:07

    Bonjour tout le monde,

    je suis en train de coder en C un programme qui doit lire dans un fichier une série de lignes et les ajouter à une liste chainée. Pour ce faire, j'utilise la fonction fgets, tel que ceci:

    t_voiture * creerVoitureFichier(FILE * file){
            t_voiture * adresse;
            adresse = malloc(sizeof(t_voiture));
            char immatriculationF[8];
            char marqueF[51];
            char modeleF[51];
            char typeCarburantF[51];
            int vitesseMaxF, poubelle;
            fscanf(file, "%i", &poubelle);
            fgets(immatriculationF, sizeof(immatriculationF), file);
            fgets(marqueF, sizeof(marqueF), file);
            fgets(modeleF, sizeof(modeleF), file);
            fgets(typeCarburantF, sizeof(typeCarburantF), file);
            fscanf(file, "%i", &vitesseMaxF);
            strcpy(adresse -> immatriculation, immatriculationF);
            strcpy(adresse -> marque, marqueF);
            strcpy(adresse -> modele, modeleF);
            strcpy(adresse -> typeCarburant, typeCarburantF);
            adresse -> vitesseMax = vitesseMaxF;
            return adresse;
    }

    Cependant, la fonction fgets de la marque n'a pas l'air de marcher. Voici la sortie du programme (affichage de la liste chainée):

    Les données sont décalées d'un cran à partir de la première marque enregistrée. Je ne comprends vraiment pas d'où viens l'erreur.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2018 à 16:22:47

      Salut,

      peux-tu montrer la structure t_voiture ? 

      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2018 à 16:23:26

        La voici:

        typedef struct voiture {
                char immatriculation[8];
                char marque[51];
                char modele[51];
                char typeCarburant[51];
                int vitesseMax;
        } t_voiture;



        • Partager sur Facebook
        • Partager sur Twitter
          19 février 2018 à 16:26:51

          Hello,

          Je pense que le problèmes est le suivant: dans ton fichier, la ligne de la plaque d'immatriculation est AA123AA\n

          Comme tu dis à fgets() que la taille de ton buffer est de 8, que fait fgets() ? Il lit au plus 7 caractères, puis place le \0 à la fin du buffer. Mais le \n n'a pas été lu, et c'est le fgets() suivant qui le lit....

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            19 février 2018 à 16:29:30

            Pardon j'ai oublié, peux-tu donner un exemple du fichier dont tu lis les informations ?
            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2018 à 16:33:26

              edgarjacobs a écrit:

              Hello,

              Je pense que le problèmes est le suivant: dans ton fichier, la ligne de la plaque d'immatriculation est AA123AA\n

              Comme tu dis à fgets() que la taille de ton buffer est de 8, que fait fgets() ? Il lit au plus 7 caractères, puis place le \0 à la fin du buffer. Mais le \n n'a pas été lu, et c'est le fgets() suivant qui le lit....


              J'ai essayé de changer le paramètre du fgets à sizeof(immatriculation)+1, mais ça ne compile pas.

              Gam' a écrit:

              Pardon j'ai oublié, peux-tu donner un exemple du fichier dont tu lis les informations ?

              La première ligne indique combien de voitures sont dans la liste chainée:

              • Partager sur Facebook
              • Partager sur Twitter
                19 février 2018 à 16:34:45

                Re,

                J'ai essayé de changer le paramètre du fgets à sizeof(immatriculation)+1, mais ça ne compile pas.

                Non, tu déclares ta variable char[9]....

                Mais ce que tu as écrit compile, mais peut-être veux-tu dire que ton programme se crash ?

                -
                Edité par edgarjacobs 19 février 2018 à 16:38:00

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  19 février 2018 à 16:44:41

                  edgarjacobs a écrit:

                  Re,

                  J'ai essayé de changer le paramètre du fgets à sizeof(immatriculation)+1, mais ça ne compile pas.

                  Non, tu déclares ta variable char[9]....

                  Mais ce que tu as écrit compile, mais peut-être veux-tu dire que ton programme se crash ?

                  -
                  Edité par edgarjacobs il y a 3 minutes


                  Je viens d'essayer avec char[9], même problème. Comme tu le dis, le programme compile mais crash:

                  Edit: je viens d'enlever la dernière lettre de la première immatriculation et le problème c'est réglé: ça doit être à cause du \n. Par contre, je ne vois pas comment résoudre le problème: est-ce qu'il faut que je rajoute un caractère en plus dans ma structure et dans mon sous-programme?

                  -
                  Edité par Sobrelouis123 19 février 2018 à 16:50:17

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 février 2018 à 16:49:05

                    Je viens de regarder ton fichier. Tu n'as qu'une seule fois l'indication du nombre d'enregistrements (3), mais tu le lis (dans poubelle) à chaque fois que tu appelles ta fonction !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      19 février 2018 à 16:54:49

                      edgarjacobs a écrit:

                      Je viens de regarder ton fichier. Tu n'as qu'une seule fois l'indication du nombre d'enregistrements (3), mais tu le lis (dans poubelle) à chaque fois que tu appelles ta fonction !


                      Oups. Je viens de le corriger. Par contre, le problème reste le même (c.f. edit de mon dernier post):

                      Immatriculation: AA123AA
                      Marque:
                      
                      Modele: Mercedes-Benz
                      
                      Type de carburant: AMG GT
                      
                      Vitesse maximum: 32767
                      Immatriculation: Essence
                      Marque:
                      
                      Modele: 320
                      
                      Type de carburant: AA123AB
                      
                      Vitesse maximum: 32767
                      Immatriculation: Tesla
                      
                      Marque: Model S
                      
                      Modele: Electricite
                      
                      Type de carburant: 240
                      
                      Vitesse maximum: 32767



                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 février 2018 à 16:58:44

                        Poste le code qui donne le résultat que tu montres.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          19 février 2018 à 17:04:43

                          edgarjacobs a écrit:

                          Poste le code qui donne le résultat que tu montres.


                          void chargerFichier(t_liste * listeCharge, char * nomFichier){
                                  FILE * file;
                                  int cellules;
                                  file = fopen(nomFichier, "r");
                                  if(file != NULL){
                                          fscanf(file, "%i", &cellules);
                                          for(int i = 0; i < cellules; i++){
                                                  if (i == 0){
                                                          t_cellule * celluleA = creerCelluleFichier(file);
                                                          listeCharge -> debut = celluleA;
                                                          listeCharge -> fin = celluleA;
                                                  } else {
                                                          t_cellule * celluleA = creerCelluleFichier(file);
                                                          listeCharge -> fin -> suivant = celluleA;
                                                          listeCharge -> fin = celluleA;
                                                  }
                                          }
                                  }
                          }
                          
                          t_voiture * creerVoitureFichier(FILE * file){
                                  t_voiture * adresse;
                                  adresse = malloc(sizeof(t_voiture));
                                  char immatriculationF[8];
                                  char marqueF[51];
                                  char modeleF[51];
                                  char typeCarburantF[51];
                                  int vitesseMaxF;
                                  fgets(immatriculationF, sizeof(immatriculationF), file);
                                  fgets(marqueF, sizeof(marqueF), file);
                                  fgets(modeleF, sizeof(modeleF), file);
                                  fgets(typeCarburantF, sizeof(typeCarburantF), file);
                                  fscanf(file, "%i", &vitesseMaxF);
                                  strcpy(adresse -> immatriculation, immatriculationF);
                                  strcpy(adresse -> marque, marqueF);
                                  strcpy(adresse -> modele, modeleF);
                                  strcpy(adresse -> typeCarburant, typeCarburantF);
                                  adresse -> vitesseMax = vitesseMaxF;
                                  return adresse;
                          }
                          
                          t_cellule * creerCelluleFichier(FILE * file){
                                  t_cellule * cellule;
                                  cellule = malloc(sizeof(t_cellule));
                                  cellule -> voiture = creerVoitureFichier(file);
                                  cellule -> suivant = NULL;
                                  return cellule;
                          }

                          (la structure cellule n'a qu'une t_voiture et l'adresse de la cellule suivante de la liste)


                          L'immatriculation est en fait décalée d'un cran elle aussi:

                          -
                          Edité par Sobrelouis123 19 février 2018 à 17:07:06

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 février 2018 à 17:16:57

                            Sobrelouis123 a écrit:

                            L'immatriculation est en fait décalée d'un cran elle aussi:

                            Bin tient ! Ligne 6, tu lis le nombre de cellules, mais tu laisses le \n dans le fichier....

                            Et tu as laissé un char[8] pour l'immatriculation !



                            -
                            Edité par edgarjacobs 19 février 2018 à 17:18:28

                            • Partager sur Facebook
                            • Partager sur Twitter

                            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                              19 février 2018 à 17:22:41

                              edgarjacobs a écrit:

                              Sobrelouis123 a écrit:

                              L'immatriculation est en fait décalée d'un cran elle aussi:

                              Bin tient ! Ligne 6, tu lis le nombre de cellules, mais tu laisses le \n dans le fichier....

                              Et tu as laissé un char[8] pour l'immatriculation !



                              -
                              Edité par edgarjacobs il y a moins de 30s

                              Comment je fais pour enlever le \n du coup?

                              J'ai laissé le char[8] parce que sinon j'ai droit à un abort :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 février 2018 à 17:28:07

                                Sobrelouis123 a écrit:

                                Comment je fais pour enlever le \n du coup?



                                fscanf(....,"%d\n",....);

                                Sobrelouis123 a écrit:

                                J'ai laissé le char[8] parce que sinon j'ai droit à un abort :)

                                Ça ne fonctionnera pas. Tu ferais bien de lire le man de fgets()



                                -
                                Edité par edgarjacobs 19 février 2018 à 17:29:48

                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  19 février 2018 à 19:55:07

                                  edgarjacobs a écrit:

                                  Sobrelouis123 a écrit:

                                  Comment je fais pour enlever le \n du coup?



                                  fscanf(....,"%d\n",....);

                                  Sobrelouis123 a écrit:

                                  J'ai laissé le char[8] parce que sinon j'ai droit à un abort :)

                                  Ça ne fonctionnera pas. Tu ferais bien de lire le man de fgets()



                                  -
                                  Edité par edgarjacobs il y a environ 1 heure


                                  C'est bon, ça fonctionne. Merci beaucoup!

                                  -
                                  Edité par Sobrelouis123 19 février 2018 à 19:55:22

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Problème avec la fonction fgets

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown