Fonction ferror

Entête à inclure

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

Fonction ferror

int ferror( FILE * stream );

Vérifie si le statut d'erreur est levé pour ce flux (suite à l'utilisation d'une fonction de manipulation de flux du module <stdio.h>). Si une erreur a effectivement été déclenchée, une valeur non nulle vous sera retournée. Pour de plus amples informations sur l'erreur précise rencontrée, il vous faudra ensuite interroger la valeur de la variable globale errno (un entier) définie dans l'entête <errno.h>. Il est aussi possible d'afficher le message d'erreur correspondant en invoquant la fonction perror.

Remarque : il est nécessaire de bien comprendre que ferror renvoie un état de type vrai/faux. Il ne permet pas de déterminer l'erreur constatée. D'où l'importante de consulter consécutivement l'état de la variable errno pour de plus amples informations sur l'erreur survenue. Mais attention, si depuis le dernier accès au fichier, d'autres fonctions ont été invoquées, il se peut alors que la valeur de la variable errno est été écrasée (voir plusieurs fois).

Le statut d'erreur associé au flux considéré peut être remis à zéro en invoquant la fonction clearerr.

Paramètre

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

Valeur de retour

Si une erreur a été détectée durant l'exécution d'une fonction précédemment invoquée, ferror reverra une value non nulle, 0 sinon. Consulter la valeur de la variable errno pour de plus amples informations sur l'erreur survenue.

Exemple de code

Afin de produire une erreur, nous allons ouvrir un fichier en lecture pour y écrire dedans : bien entendu, il n'y a aucune chance que cela puisse fonctionner.

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

int main( int argc, char * argv[] ) {

    FILE * myFile = fopen( "anExistingFile", "r" );
    int rc = fputc( '!', myFile );

    printf( "Results == %d %d %d\n", rc, ferror( myFile ), errno );
    perror( "My message" );

    rc = fclose( myFile );
        
    return 0;
}

Le résutat produit par l'exécution de ce programme est le suivant :

$> sample
Results == -1 1 9
My message: Bad file descriptor
$>

La première valeur, -1, correspond au code retour de la fonction fputc ( valeur équivalente à la macro EOF). La seconde valeur, 1, est le résultat renvoyé par ferror : le status d'érreur est donc bien mis pour le flux associé à la variable myFile. Le code erreur produit (stocké dans la variable errno) est donc le code 9. En voici sans définition.

#define  EBADF        9  /* Bad file descriptor */

Sujets connexes