#define _POSIX_C_SOURCE 200809L #include <stdio.h>
ssize_t getline( char ** restrict lineptr, size_t * restrict n, FILE * restrict stream );
La fonction getline permet de lire une ligne complète depuis un flux de caractères. Contrairement à
fgets, elle peut allouer ou agrandir automatiquement le buffer utilisé pour stocker
la ligne lue.
Si le pointeur contenu dans *lineptr vaut NULL et si *n vaut 0, la fonction
alloue elle-même un buffer de taille suffisante. Ce buffer devra ensuite être libéré avec la fonction
free.
Si le caractère de fin de ligne est lu, il est conservé dans le buffer. Un caractère nul terminal '\0'
est ensuite ajouté afin de produire une chaîne de caractères C valide.
En cas de succès, la fonction renvoie le nombre de caractères lus. Le caractère de fin de ligne est comptabilisé s'il a été lu, mais le caractère nul terminal ne l'est pas.
En cas de fin de fichier ou d'erreur, la fonction renvoie -1. Pour distinguer ces deux situations, vous
pouvez utiliser les fonctions feof et ferror.
EINVAL : l'un des paramètres passés à la fonction est invalide.
ENOMEM : il n'y a plus assez de mémoire disponible pour allouer ou agrandir le buffer.
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 |
#define _POSIX_C_SOURCE 200809L #include <errno.h> #include <stdio.h> #include <stdlib.h> int main( int argc, char * argv[] ) { if ( argc != 2 ) { printf( "Usage: sample filename\n" ); return EXIT_FAILURE; } FILE * inputFile = fopen( argv[1], "r" ); if ( inputFile == NULL ) { perror( "fopen" ); return EXIT_FAILURE; } char * line = NULL; size_t capacity = 0; ssize_t length; while ( ( length = getline( &line, &capacity, inputFile ) ) != -1 ) { printf( "%ld caracteres : %s", (long) length, line ); } if ( ferror( inputFile ) ) { perror( "getline" ); free( line ); fclose( inputFile ); return EXIT_FAILURE; } free( line ); fclose( inputFile ); return EXIT_SUCCESS; } |
$> cat data.txt Bonjour Une ligne plus longue $> gcc -o sample Sample.c $> ./sample data.txt 8 caracteres : Bonjour 22 caracteres : Une ligne plus longue $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :