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 freopen

Entête à inclure

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

Fonctions freopen

FILE * freopen( const char * filename, const char * accessMode, FILE * stream );                                // Avant C99
FILE * freopen( const char * restrict filename, const char * restrict accessMode, FILE * restrict stream );     // A partir de C99

Cette fonction permet de réutiliser la structure FILE, spécifiée en dernier paramètre, pour ouvrir un nouveau flux. Le flux précédemment associé à votre FILE * est automatiquement fermé et les éventuelles erreurs précédentes seront ignorées. Les paramètres filename et accessMode ont la même signification que pour la fonction fopen.

L'intérêt principal de cette fonction est de pouvoir réaffecter les flux standards (stdin, stdout et stderr) de votre programme.

Paramètres

Valeur de retour

L'ouverture d'un fichier peut échouer pour différentes raisons (problème de sécurité, fichier non existant, ...). Il est donc nécessaire de vérifier la valeur retournée par un appel à cette fonction. Si la valeur retournée est non nulle, alors tout c'est bien passé : dans ce cas, la valeur de retour (de type FILE *) correspond au descripteur du fichier ouvert et sera donc équivalent à stream.

Si, par contre, une valeur nulle vous est retournée, alors c'est qu'une erreur vient de survenir. Il vous faudra alors consulter la variable errno pour obtenir de plus amples informations sur l'erreur constatée.

Codes erreurs pouvant être retournés

Exemple de code

Le programme proposé fait en sorte de ne plus produire ses messages sur la console, mais plutôt dans deux fichiers : results.txt pour les messages normaux et errors.txt pour les messages d'erreurs.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // On réaffecte stdout et stderr
    FILE * res = freopen("results.txt", "w", stdout);
    FILE * res2 = freopen("errors.txt", "w", stderr);

    // On vérifie les réouvertures de fichiers
    if (res == NULL || res2 == NULL) {
        fprintf(stderr, "Cannot reopen streams");
        exit(EXIT_FAILURE);
    }

    // On test nos nouveaux flux.
    printf("Hello World, mais pas dans la console.");
    fprintf(stderr, "Faux message d'erreur, mais pas dans la console.");

    return EXIT_SUCCESS;
}
Exemple d'utilisation de la fonction freopen

Conformité

C89 / C99 / C11 / C18

Sujets connexes

La structure FILE *

La fonction fclose
La fonction fopen
La fonction fprintf
La fonction fread
La fonction fscanf
La fonction fwrite