freopen, freopen_s
|
Défini dans l'en-tête
<stdio.h>
|
||
| (1) | ||
| (jusqu'à C99) | ||
| (depuis C99) | ||
| (2) | (depuis C11) | |
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).
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 :
-
-
newstreamptrest un pointeur nul -
streamest un pointeur nul -
modeest un pointeur nul
-
-
Comme pour toutes les fonctions à vérification de limites,
freopen_sn'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
stream
en cas de succès, pointeur nul en cas d'échec.
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
|
(C11)
|
ouvre un fichier
(fonction) |
|
ferme un fichier
(fonction) |
|
|
Documentation C++
pour
freopen
|
|