#include <stdio.h> // <cstdio> en C++
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.
fgets
).
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
.
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.
...
#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; }
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 :