Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Fonction getline (POSIX)

Entête à inclure

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>

Fonction getline

ssize_t getline( char ** restrict lineptr, size_t * restrict n, FILE * restrict stream );
Cette fonction n'appartient pas au standard ISO du langage C. Elle est définie par POSIX.1-2008. Sa disponibilité dépend donc de votre environnement de compilation, notamment sous Windows.

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.

Paramètres

Valeur de retour

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.

Codes erreurs pouvant être retournés

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.

Exemple de 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 
#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
$>

Sujets connexes

fclose
feof
ferror
fgets
FILE *
fopen
free
malloc


Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé