Warning: filemtime(): stat failed for /home/developpez/www/developpez-com/upload/nicolasj./article.css in /home/developpez/www/developpez-com/template/entete.php on line 241
IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Lire une ligne d'un fichiers en C

Date de publication : 19 Mars 2005 , Date de mise à jour : 10 Aout 2005

Par Nicolas Joseph (home)
 

Cette fonction a pour but de lire la prochaine ligne du flux de sortie et de la placer dans une zone de mémoire allouée dynamiquement dont l'adresse est stockée dans la variable . En cas d'erreur, la fonction retourne la valeur EXIT_FAILURE. Si le la fichier du fichier est atteinte, est mis à NULL et la fonction retourne EXIT_FAILURE.


getNextLine.h
#ifndef H_NJ_GETNEXTLINE_1903052321
#define H_NJ_GETNEXTLINE_1903052321

#include <stdio.h>

#define skipNextLine(file) getNextLine ((file), NULL)

int getNextLine (FILE *stream, char **pp_line);

#endif /* not H_NJ_GETNEXTLINE_1903052321 */
getNextLine.c
#include <stdlib.h>
#include "getNextLine.h"

int getNextLine (FILE *stream, char **pp_line)
{
   int ret = EXIT_SUCCESS;

   if (stream)
   {
      int end = 0;
      char *line = NULL;
      size_t size = 1;
      int i = 0;

      while (ret == EXIT_SUCCESS && end == 0)
      {
         int c = fgetc (stream);
         switch (c)
         {
            case EOF:
               if (feof (stream))
               {
                  if (pp_line && !line)
                  {
                     *pp_line = NULL;
                     ret = EXIT_FAILURE;
                  }
                  end = 1;
               }
               else
               {
                  ret = EXIT_FAILURE;
               }
            break;
            default:
               if (pp_line)
               {
                  if (i == size - 1)
                  {
                     void *tmp = NULL;

                     size <<= 1;
                     tmp = realloc (line, sizeof (*line) * size);
                     if (tmp)
                     {
                        line = tmp;
                     }
                     else
                     {
                        free (line);
                        line = NULL;
                        ret = EXIT_FAILURE;
                     }
                  }
                  if (line)
                  {
                     if (c == '\n')
                     {
                        end = 1;
                     }
                     else
                     {
                         line[i] = c;
                         i++;
                     }
                  }
               }
            break;
         }
      }
      if (pp_line && line)
      {
          line[i] = '\0';
          *pp_line = line;
      }
   }
   else
   {
      ret = EXIT_FAILURE;
   }
   return (ret);
}
Voic un exemple d'utilisation de cette fonction dans une boucle pour lire l'intégralité d'un fichier :
char *p_line = NULL;
FILE *file = fopen (...);

while (getNextLine (file, &p_line) && p_line)
{
   ...
   free (p_line);
   p_line = NULL;
}


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Nicolas Joseph. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.