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 :

Fonctions fgets et gets

Entête à inclure

#include <stdio.h>  // <cstdio> en C++

Fonctions fgets et gets

char * fgets( char * string, int maxLength, FILE * stream );                           // Avant C99
char * fgets( char * restrict string, int maxLength, FILE * restrict stream );         // A partir de C99
char * gets( char * string );              // Supprimée à partir de C11

Ces deux fonctions permettent de lire le contenu d'une chaîne de caractères à partir d'un flux. Outre le fait que dans le cas de la fonction gets le flux soit imposé (stdin), ces deux fonctions ne fonctionnent pas tout à fait de la même manière.

Dans le cas de la fonction fgets, il est possible de sécuriser la copie des caractères constitutifs de la chaîne en spécifiant une taille maximale à lire. Ainsi, si la chaîne lue est plus longue que le buffer de réception, aucun dépassement en mémoire ne sera effectué. Il est à noter que le nombre de caractères pouvant être lu sera au maximum de (maxLength - 1). Effectivement, un caractère '\0' sera systématiquement ajouté en fin de chaîne. Si un caractère de fin de flux (EOF) ou un caractère de fin de ligne est rencontré, la lecture sera stoppée.

Dans le cas de la fonction gets, le flux de lecture est donc imposé : stdin. La lecture de la chaîne sera faite jusqu'à qu'un caractère de fin de flux (EOF) ou un caractère de fin de ligne soit rencontré. Un caractère '\0' sera ajouté à la fin de la chaîne lue. De plus, il sera de votre responsabilité de garantir que le buffer soit alloué de taille suffisante pour recueillir la chaîne lue. Si ce n'est pas le cas, d'autres données pourront être écrasées.

Paramètres

Valeur de retour

En cas de succès, le pointeur string doit être retourné.

En cas d'erreur, un pointeur nul sera renvoyé. Il vous faudra alors consulter la variable errno pour obtenir de plus amples informations sur l'erreur constatée. Il vous sera aussi possible d'utiliser la fonction ferror.

Codes erreurs pouvant être retournés

EAGAIN : le flux est vérrouillé et il faudra tenter ultérieurement la lecture.

EBADF : le descripteur de flux (FILE *) passé en paramètre est invalide ou ne permet pas la lecture.

EINTR : l'opération de lecture est interrompue suite à la réception d'un signal.

EIO : une erreur d'accès physique au flux vient d'être générée.

...

Exemple de code

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_LENGTH 10

int main( int argc, char * argv[] ) {
    
    argc--;   argv++;
    
    if ( argc == 0 ) {
        printf( "Usage: sample filename\n" );
        exit( 0 );
    }
    
    FILE * inputFile = fopen( argv[0], "r" );
    if ( inputFile == NULL ) {
        printf( "Cannot open file %s\n", argv[0] );
        exit( -1 );
    }
    
    char * buffer = (char *) malloc( MAX_LENGTH );
    while ( ! feof( inputFile ) ) {
        fgets( buffer, MAX_LENGTH, inputFile );
        if ( ferror( inputFile ) ) {
            fprintf( stderr, "Reading error with code %d\n", errno );
            break;
        }
        
        puts( buffer );        
    }

    free( buffer );
    fclose( inputFile );
        
    return 0;
}

Sujets connexes

fgetc
fputs
puts