Namespaces
Variants

freopen, freopen_s

Depuis fr.cppreference.net
< c | io
 
 
Entrée/sortie de fichiers
Types et objets
        
Fonctions
Accès aux fichiers
(C95)
Entrée/sortie non formatée
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrée formatée
Entrée/sortie directe
Sortie formatée
Positionnement dans le fichier
Gestion des erreurs
Opérations sur les fichiers
 
Défini dans l'en-tête <stdio.h>
FILE* freopen( const char* filename, const char* mode,
               FILE* stream );
(1) (jusqu'à C99)
FILE* freopen( const char* restrict filename, const char* restrict mode,
               FILE* restrict stream );
(depuis C99)
errno_t freopen_s( FILE* restrict* restrict newstreamptr,
                   const char* restrict filename, const char* restrict mode,
                   FILE* restrict stream );
(2) (depuis C11)
1) Tout d'abord, tente de fermer le fichier associé à stream, en ignorant toute erreur. Ensuite, si filename n'est pas nul, tente d'ouvrir le fichier spécifié par filename en utilisant mode comme si par fopen, et associe ce fichier au flux de fichier pointé par stream. Si filename est un pointeur nul, alors la fonction tente de rouvrir le fichier déjà associé à stream (les modifications de mode autorisées dans ce cas sont définies par l'implémentation).
2) Identique à (1), sauf que mode est traité comme dans fopen_s et que le pointeur vers le flux de fichier est écrit dans newstreamptr et les erreurs suivantes sont détectées à l'exécution et appellent la fonction de gestionnaire de contrainte actuellement installée :
  • newstreamptr est un pointeur nul
  • stream est un pointeur nul
  • mode est un pointeur nul
Comme pour toutes les fonctions vérifiées aux limites, freopen_s n'est garanti d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ comme la constante entière 1 avant d'inclure <stdio.h>.

Paramètres

filename - nom du fichier à associer au flux de fichier
mode - chaîne de caractères terminée par un caractère nul déterminant le nouveau mode d'accès au fichier
stream - le flux de fichier à modifier
newstreamptr - pointeur vers un pointeur où la fonction stocke le résultat (un paramètre de sortie)

Indicateurs d'accès aux fichiers

Accès fichiers
chaîne de mode
Signification Explication Action si le fichier
existe déjà
Action si le fichier
n'existe pas
"r" lecture Ouvrir un fichier en lecture lire depuis le début échec d'ouverture
"w" écriture Créer un fichier pour écriture détruire le contenu créer un nouveau
"a" ajout Ajouter à un fichier écrire à la fin créer un nouveau
"r+" lecture étendue Ouvrir un fichier en lecture/écriture lire depuis le début erreur
"w+" écriture étendue Créer un fichier pour lecture/écriture détruire le contenu créer un nouveau
"a+" ajout étendu Ouvrir un fichier pour lecture/écriture écrire à la fin créer un nouveau
L'indicateur de mode d'accès au fichier "b" peut éventuellement être spécifié pour ouvrir un fichier en mode binaire. Cet indicateur n'a aucun effet sur les systèmes POSIX, mais sous Windows, il désactive le traitement spécial de '\n' et de '\x1A'.
Pour les modes d'accès avec ajout, les données sont écrites à la fin du fichier, quelle que soit la position actuelle de l'indicateur de position dans le fichier.
Le comportement est indéfini si le mode ne fait pas partie des chaînes listées ci-dessus. Certaines implémentations définissent des modes supplémentaires pris en charge (par exemple Windows).
En mode mise à jour ('+'), les entrées et sorties sont possibles, mais une sortie ne peut pas être suivie d'une entrée sans un appel intermédiaire à fflush, fseek, fsetpos ou rewind, et une entrée ne peut pas être suivie d'une sortie sans un appel intermédiaire à fseek, fsetpos ou rewind, sauf si l'opération d'entrée a rencontré la fin du fichier. En mode mise à jour, les implémentations sont autorisées à utiliser le mode binaire même si le mode texte est spécifié.
L'indicateur de mode d'accès au fichier "x" peut éventuellement être ajouté aux spécificateurs "w" ou "w+". Cet indicateur force la fonction à échouer si le fichier existe, au lieu de l'écraser. (C11)
Lors de l'utilisation de fopen_s ou de freopen_s, les permissions d'accès au fichier pour tout fichier créé avec "w" ou "a" empêchent les autres utilisateurs d'y accéder. L'indicateur de mode d'accès au fichier "u" peut éventuellement être préfixé à tout spécificateur qui commence par "w" ou "a", pour activer les permissions fopen par défaut. (C11)

Valeur de retour

1) Une copie de la valeur de stream en cas de succès, pointeur nul en cas d'échec.
2) zéro en cas de succès (et une copie de la valeur de stream est écrite dans *newstreamptr, non nul en cas d'erreur (et un pointeur nul est écrit dans *newstreamptr sauf si newstreamptr est lui-même un pointeur nul).

Notes

freopen est la seule manière de changer l'orientation étroite/large d'un flux une fois qu'elle a été établie par une opération d'E/S ou par fwide.

La version Microsoft CRT de freopen ne prend en charge aucun changement de mode lorsque filename est un pointeur nul et traite cela comme une erreur (voir documentation). Une solution de contournement possible est la fonction non standard _setmode().

Exemple

Le code suivant redirige stdout vers un fichier.

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

int main(void)
{
    puts("stdout is printed to console");
    if (freopen("redir.txt", "w", stdout) == NULL)
    {
       perror("freopen() failed");
       return EXIT_FAILURE;
    }
    puts("stdout is redirected to a file"); // this is written to redir.txt
    fclose(stdout);
    return EXIT_SUCCESS;
}

Sortie :

stdout is printed to console

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.21.5.4 La fonction freopen (p : TBD)
  • K.3.5.2.2 La fonction freopen_s (p : TBD)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.21.5.4 La fonction freopen (p : 224-225)
  • K.3.5.2.2 La fonction freopen_s (p : 429-430)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.21.5.4 La fonction freopen (p : 307)
  • K.3.5.2.2 La fonction freopen_s (p : 590)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.19.5.4 La fonction freopen (p : 272-273)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.9.5.4 La fonction freopen

Voir aussi

ouvre un fichier
(fonction)
ferme un fichier
(fonction)
Documentation C++ pour freopen