lecture séquencielle fichier texte
Salut,
J' écris deux fonctions pour lire de manière séquentielle
un fichier. Une tourne, l' autre non. Le problème est de lire la dernière ligne du fichier si elle est vide, après un retour de chariot.
Code:
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
|
#include <stdio.h>
#include <string.h>
#include <assert.h>
int fget_buf( char * s , size_t nb, FILE * fd )
{ char * c, c1 ;
int err = 0 ;
if( s == NULL || nb <= 0 || fd == 0 ) return err = 2 ;
if( fgets(s, nb , fd ) != NULL )
{
if( ( c = strchr( s , '\n' )) != NULL )
{ *c = '\0' ;
err = 0 ;
return err ;
} else
{
while( (c1 = fgetc(fd) ) != '\n' && c1 != EOF);
err = 1 ;
return err ;
}
}
else
if( strlen(s) ) s[0] = '\0' ;
return err ;
}
int fget_line( char * s , const size_t nb, FILE * fd )
{ int err = 0;
int c ;
size_t w = 0 ;
if( !s || nb <= 0 || ! fd )
{ err = 2 ;
return err ;
}
while ((c = fgetc (fd)) != '\n' && c != EOF)
{ if( w < nb - 1 )
s[w++] = c;
else
{ while((c = fgetc(fd)) != '\n' && c != EOF);
err = 1;
return err ;
}
}
s[w] = '\0';
return err;
}
int main ()
{ char z[128] ;
int r = 1 ;
FILE * fd = 0 ;
fd = fopen("toto.txt", "r") ;
assert( fd != 0 ) ;
while( ! feof(fd) )
{ memset( z, 0 , sizeof(z) ) ;
r = fget_buf( z, sizeof(z), fd ) ; // pas bon
//r = fget_line( z, sizeof(z), fd ) ; // ok
if( r == 0 )
printf("%02d) =>%s\n", strlen(z), z ) ;
else
if( r == 2 )
{ printf("erreur globale\n") ;
fclose(fd) ;
return ;
}
else
if( r == 1 )
{ printf("saisie trop longue\n") ;
fclose(fd) ;
return ;
}
}
fclose(fd) ;
return 0 ;
} |
C'est fget_buf qui pose problème. Si vous avez une idée ?