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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*---------------------------------------------------------------------------*/
long LireLigne(FILE * f, char ** buff, long dim);
/*
- Lecture d'une ligne sur un fichier texte. la ligne peut être terminée par
une fin de ligne ou la fin de fichier.
La fonction alloue la quantité suffisante de mémoire pour stocker la ligne
et le zéro terminal. Le caractère de fin de ligne, si il existe, n'est pas stocké.
- f : Fichier texte ouvert sur lequel est lu la ligne
- buff : Adresse du pointeur dans lequel sera placée l'adresse de la chaîne obtenue.
Le pointeur doit contenir l'adresse de la chaîne obtenue lors de l'appel
précédent à la fonction (pour libération de la mémoire allouée) ou NULL
si il s'agit du premier appel.
Le pointeur est mis à NULL et la mémoire libérée si
- la mémoire disponible est insuffisante
- la fin du fichier est atteinte.
- dim : Nombre de bytes alloués initialement pour stocker la ligne.
Si dim <2 , une valeur par défaut est utilisée.
La taille allouée sera augmentée d'un facteur 2 tant que nécessaire
- Renvoie le nombre de caractères de la chaîne. le zéro terminal n'est pas compté
En cas de fin de fichier renvoie 0 (et *Buff == NULL)
En cas d'erreur d'allocation mémoire renvoie -1 (et *Buff == NULL)
Pour une ligne vide renvoie 0 (et *Buff != NULL contient '\0')
Exemple :
char* buff = NULL;
long nb;
....
do
{
nb = LireLigne(f,&buff,5);
if (buff!= NULL) printf("<%s> nb = %ld\n", buff,nb);
else printf("NULL %ld\n",nb);
}
while (buff!= NULL);
printf(nb <0 ? "Erreur d'allocation\n" : "Fin de fichier\n");
....
---------------------------------------------------------------------------*/
static long Cherchecar(char* buffer, long offset, int car)
{
char * pos = strchr(buffer+offset,car);
return pos != NULL ? pos - buffer : -1;
}
static char * RedimAlloc( char *buffer, size_t dim)
{
char * q = realloc(buffer,dim);
if (q == NULL) free(buffer);
return q;
}
/*---------------------------------------------------------------------------*/
#define DIM_DEFAULT 32
long LireLigne(FILE * f, char ** buff, long dim)
{
long eoln = -1;
long zero = -1;
char *notEOF;
int AllocError;
long offset = 0 ;
free(*buff);
if (dim<2) dim = DIM_DEFAULT;
*buff = malloc((size_t)dim);
AllocError = *buff == NULL;
if (!AllocError)
{
notEOF= fgets(*buff,dim,f);
if (!notEOF)
{
free(*buff);
*buff = NULL;
}
while (notEOF && eoln < 0 && *buff != NULL)
{
eoln = Cherchecar(*buff,offset,'\n');
if (eoln >=0) (*buff)[eoln] = 0;
else
{
zero = Cherchecar(*buff,offset,'\0');
if (zero == dim-1)
{
offset = dim-1;
dim *=2;
*buff = RedimAlloc(*buff,(size_t)dim);
AllocError = *buff == NULL;
}
if (!AllocError)
if (!(notEOF = fgets(*buff+offset,offset+2,f))) eoln = zero;
}
}
if (*buff!= NULL) *buff = RedimAlloc(*buff,(size_t)(eoln+1));
}
return *buff != NULL ? eoln
: AllocError ? -1 : 0;
}
#undef DIM_DEFAULT |
Partager