Fonctions fgetc, getc et getchar

Entête à inclure

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

Fonctions fgetc, getc et getchar

int fgetc( FILE * stream );
int getc( FILE * stream );
int getchar();

Ces fonctions permettent toutes les trois de lire un caractère à la position courante du flux de caractères considéré. La fonction getchar impose le flux : stdin. Pour les deux autres fonctions, le flux de caractères à utiliser doit être spécifié en paramètre. Une fois le caractère lu, la position de la tête de lecture associé au flux considéré est décalée sur le prochain caractère à lire.

En fait fgetc et getc sont identiques au détail près que sur certains compilateurs la fonction getc est implémentée sous forme d'une macro.

Paramètres

  • stream: ce paramètre permet d'indiquer le flux de caractères (ou d'octets) à utiliser pour la lecture. N'oubliez pas que la valeur de ce paramètre à été initialement capturée lors de l'invocation de la fonction fopen.

Valeur de retour

Soit un octet à correctement été lu, et dans ce cas sa valeur vous est retournée (entre 0 et 255), soit une erreur c'est produite et dans ce cas la valeur EOF vous sera retournée. Cela donne 257 valeurs différentes pouvant être renvoyées : cela explique que le type de retour soit int plutôt que unsigned char.

Si une erreur vous est retournée (code OEF), il vous faudra alors consulter la variable errno pour obtenir de plus amples informations.

Codes erreurs pouvant être retournés

EAGAIN : le descripteur de flux est marqué comme non-bloquant et aucune données n'est disponible pour l'instant. Il faudra retenter la lecture ultérieurement.

EBADF : le descripteur de flux (FILE *) passé en paramètre est invalide.

EINTR : la lecture sur une ressource lente a été interrompue par l'arrivée d'un signal avant que des données ne soient disponibles.

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

...

Exemple de code

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

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 );
    }
    
    while ( ! feof( inputFile ) ) {
        int theCurrentChar;
        printf( "Appuyez sur <ENTER> pour lire le prochain caractère du fichier");
        fflush( stdin );
        fgetc( stdin );
        
        theCurrentChar = fgetc( inputFile );
        printf( "Le caractère actuel est <<%c>>\n", theCurrentChar );
    }

    fclose( inputFile );
        
    return 0;
}

Il est à noter que ce programme n'est certainnement pas le plus efficace pour calculer la taille d'un fichier, mais il est proposé à titre d'exemple d'utilisation de la fonction feof.

Sujets connexes

fopen
fputc
fclose