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 );
char * gets( char * string );

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

  • string : un buffer pemettant de recueillir la chaîne à lire.
  • maxLenght : permet de spécifier le nombre de caractères maximal pouvant être utilisé au sein du buffer (uniquement dans le cas d'une utilisation de la fonction fgets).
  • stream : ce paramètre permet d'indiquer le flux de caractères à utiliser pour la lecture.

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