Partage
  • Partager sur Facebook
  • Partager sur Twitter

fgets et fread

Pas copain ?

Sujet résolu
    7 mai 2006 à 19:22:38

    Bonjour, est normal que fgets ne fonctionne pas après un fread et vi versa ? où c'est moi.
    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2006 à 19:50:43

      Je pense que ça vien du fait que fread est destinée aux fichiers binaires et que fgets sert à lire des chaînes (d'où le 's' de fgets qui signifie string) dans un fichier "texte.

      M'enfin, j'dis ça mais je peux me tromper.
      • Partager sur Facebook
      • Partager sur Twitter
        7 mai 2006 à 20:16:47

        Citation : DefneT

        Bonjour, est normal que fgets ne fonctionne pas après un fread et vi versa ? où c'est moi.


        Pas normal. Montre ton code et le fichier d'essai.
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          8 mai 2006 à 10:52:55

          J'ai finalement abandonnée l'utilisation du fread mais j'ai un autre problème concernant la copie avec ce fgets :


          #define MALLOC(n, type) (type *)malloc(sizeof(type)*(n))

          #define N 1024

          int main(int argc, char **argv)
          {
                  FILE *fichier = NULL;
                  char **chaines    = MALLOC(N, char *);
                  char *buffer       = MALLOC(N, char);

                  int nombreDeLigne=0;

                  fichier = fopen(argv[1], "r");
                 
                  while( fgets(buffer, N, fichier) != NULL )
                  {       
                          strcpy(chaines[nombreDeLigne], buffer);    //<-- ERREUR DE SEGMENTATION
                          nombreDeLigne++;
                  }

          // fermeture et free

          return 0;
          }
          • Partager sur Facebook
          • Partager sur Twitter
            8 mai 2006 à 11:00:11

            Tu n'alloues pas de mémoire pour le buffer où tu copies la chaîne. Comment tu veux que ça marche ?
            Sinon, ton malloc est faux : Tu n'inclues pas stdlib.h et en plus tu forces la conversion, ce qui ne sert à rien et masque l'erreur.
            Tu n'inclues pas non plus stdio.h ni string.h...
            Faudrait compiler avec des flags pour activer les warnings.
            • Partager sur Facebook
            • Partager sur Twitter
              8 mai 2006 à 11:13:27

              Ne t'en fait pas pour les inclusions, ils sont tous dans un base.h (jai juste oublier de le préciser).

              Pour le buffer, il n'est pas allouer ? ça ne marche pas char *buffer = MALLOC(N, char); ? Je compile bien avec -Wall mais il y a pas d'erreur à la sortie.
              • Partager sur Facebook
              • Partager sur Twitter
                8 mai 2006 à 12:05:27

                Non je parle de l'autre buffer, chaines : Tu alloues des pointeurs (un tableau de pointeurs) mais tu n'alloues pas chaque sous-tableau du tableau !
                • Partager sur Facebook
                • Partager sur Twitter
                  8 mai 2006 à 12:22:32

                  Ah oui, je pourrrais avoir un exemple de ce que ça donne ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 mai 2006 à 12:35:02

                    Citation : DefneT

                    Ah oui, je pourrrais avoir un exemple de ce que ça donne ?


                    Si je reprends ta macro infernale (qui utilise le type, pourquoi ? C'est inutile)

                       chaines[nombreDeLigne] = MALLOC(strlen(buffer) + 1, char);
                       strcpy(chaines[nombreDeLigne], buffer);    //<-- ERR

                    garde en tête que le '\n' de buffer est probablement présent.

                    Pour le retirer proprement, je conseille ceci :

                    void clean (char *s, FILE *fp)
                    {
                       /* search ... */
                       char *p = strchr (s, '\n'); /* <string.h> */
                       if (p != NULL)
                       {
                          /* ... and kill */
                          *p = 0;
                       }
                       else
                       {
                          /* purge */
                          int c;
                          while ((c = fgetc(fp)) != '\n' && c != EOF)
                          {
                          }
                       }
                    }

                    Détails ici

                    http://mapage.noos.fr/emdel/notes.htm#saisie
                    http://mapage.noos.fr/emdel/notes.htm#fichiers
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      8 mai 2006 à 12:59:05

                      C'est bon je crois que ça remarche.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      fgets et fread

                      × 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