#include <stdio.h> // <cstdio> en C++
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.
Mode d'ouverture | Description | ||
---|---|---|---|
Pour les fichiers en mode texte. | |||
"r" (pour read) | Ouverture du flux en lecture. Attention : le fichier doit exister préalablement. | ||
"r+" | Ouverture du flux en lecture/écriture, et la position courante est fixée au début du fichier. Attention : le fichier doit exister préalablement. | ||
"w" (pour write) | Ouverture du flux en écriture. Si le fichier existe, il sera alors écrasé. Sinon le fichier sera créé. | ||
"w+" | Ouverture du flux en lecture/écriture. Si le fichier existe, il sera alors écrasé et la position courante est fixée au début du fichier. Sinon le fichier sera créé. | ||
"a" (pour append) | Ouverture du flux en mode ajout. Si le fichier n'existe pas, il sera alors créé. Sinon, son contenu sera conservé et la position courante sera à la fin du fichier. | ||
"a+" | Ouverture du flux en mode lecture/ajout. Si le fichier n'existe pas, il sera alors créé. La position courante pour les lectures sera en début de fichier et celle pour les écritures en fin de fichier. | ||
Pour les fichiers en mode binaire. | |||
"rb" (read binary) | Ouverture du flux en lecture. Attention : le fichier doit exister préalablement. | ||
"rb+" | Ouverture du flux en lecture/écriture, et la position courante est fixée au début du fichier. Attention : le fichier doit exister préalablement. | ||
"wb" (write binary) | Ouverture du flux en écriture. Si le fichier existe, il sera alors écrasé. Sinon le fichier sera créé. | ||
"wb+" | Ouverture du flux en lecture/écriture. Si le fichier existe, il sera alors écrasé et la position courante est fixée au début du fichier. Sinon le fichier sera créé. | ||
"ab" (append binary) | Ouverture du flux en mode ajout. Si le fichier n'existe pas, il sera alors créé. Sinon, son contenu sera conservé et la position courante sera à la fin du fichier. | ||
"ab+" | Ouverture du flux en mode lecture/ajout. Si le fichier n'existe pas, il sera alors créé. La position courante pour les lectures sera en début de fichier et celle pour les écritures en fin de fichier. |
FILE *
à recycler.
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.
FILE *
) passé en paramètre est invalide.
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; } |
C89 / C99 / C11 / C18
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 :