Namespaces
Variants

freopen, freopen_s

From cppreference.net
< c ‎ | io
Défini dans l'en-tête <stdio.h>
(1)
FILE * freopen ( const char * filename, const char * mode,
FILE * stream ) ;
(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) Premièrement, tente de fermer le fichier associé au 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 le ferait 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é au stream (il est défini par l'implémentation quels changements de mode sont autorisés dans ce cas).
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 que les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contraintes actuellement installée :
  • newstreamptr est un pointeur nul
  • stream est un pointeur nul
  • mode est un pointeur nul
Comme pour toutes les fonctions à vérification de limites, freopen_s n'est garantie 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__ à la constante entière 1 avant d'inclure <stdio.h> .

Table des matières

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)

Drapeaux d'accès aux fichiers

Chaîne de mode d'accès
au fichier
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 de l'ouverture
"w" écriture Créer un fichier en écriture détruire le contenu créer nouveau
"a" ajout Ajouter à un fichier écrire à la fin créer nouveau
"r+" lecture étendue Ouvrir un fichier en lecture/écriture lire depuis le début erreur
"w+" écriture étendue Créer un fichier en lecture/écriture détruire le contenu créer nouveau
"a+" ajout étendu Ouvrir un fichier en lecture/écriture écrire à la fin créer nouveau
Le drapeau de mode d'accès "b" peut être spécifié optionnellement pour ouvrir un fichier en mode binaire. Ce drapeau n'a aucun effet sur les systèmes POSIX, mais sous Windows il désactive le traitement spécial de ' \n ' et ' \x1A ' .
Dans les modes d'accès en ajout, les données sont écrites à la fin du fichier indépendamment de la position courante de l'indicateur de position.
Le comportement est indéfini si le mode n'est pas une des chaînes listées ci-dessus. Certaines implémentations définissent des modes supplémentaires supportés (ex. Windows ).
En mode mise à jour ( '+' ), les entrées et sorties peuvent être effectuées, 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 quand le mode texte est spécifié.
Le drapeau de mode d'accès "x" peut être ajouté optionnellement aux spécificateurs "w" ou "w+" . Ce drapeau force la fonction à échouer si le fichier existe, au lieu de l'écraser. (C11)
Lors de l'utilisation de fopen_s ou freopen_s , les permissions d'accès pour tout fichier créé avec "w" ou "a" empêchent les autres utilisateurs d'y accéder. Le drapeau de mode d'accès "u" peut être préfixé optionnellement à tout spécificateur commençant par "w" ou "a" , pour activer les permissions par défaut de fopen . (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-zéro 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 modifier 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 considère cela comme une erreur (voir la 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 C17 (ISO/CEI 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/CEI 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/CEI 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