fopen_s
, _wfopen_s
Ouvre un fichier. Ces versions ont des améliorations de fopen
_wfopen
sécurité, comme décrit dans les fonctionnalités de sécurité du CRT.
Syntaxe
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
errno_t _wfopen_s(
FILE** pFile,
const wchar_t *filename,
const wchar_t *mode
);
Paramètres
pFile
Pointeur vers le pointeur de fichier qui reçoit le pointeur vers le fichier ouvert.
filename
Nom du fichier à ouvrir.
mode
Type d'accès autorisé.
Valeur retournée
Zéro si l'opération a réussi ; code d'erreur en cas de échec. Pour plus d’informations sur ces codes d’erreur, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
Conditions d’erreur
pFile |
filename |
mode |
Valeur de retour | Contenu de pFile |
---|---|---|---|---|
NULL |
n'importe laquelle | n'importe laquelle | EINVAL |
inchangé |
n'importe laquelle | NULL |
n'importe laquelle | EINVAL |
inchangé |
n'importe laquelle | n'importe laquelle | NULL |
EINVAL |
inchangé |
Notes
Les fopen_s
fonctions et _wfopen_s
ne peuvent pas ouvrir un fichier pour le partage. Si vous avez besoin de partager le fichier, utilisez _fsopen
ou _wfsopen
utilisez la constante de mode de partage appropriée, par exemple pour _SH_DENYNO
le partage en lecture/écriture.
La fopen_s
fonction ouvre le fichier spécifié par filename
. _wfopen_s
est une version à caractères larges et fopen_s
les arguments à mettre en valeur sont des chaînes à _wfopen_s
caractères larges. _wfopen_s
et fopen_s
se comportent de façon identique, sinon.
fopen_s
accepte les chemins d'accès valides sur le système de fichiers au point d'exécution ; les chemins d'accès UNC et les chemins d'accès qui impliquent des lecteurs réseau mappés sont acceptés par fopen_s
du moment où le système qui exécute le code a accès au partage ou au lecteur réseau mappé au moment de l'exécution. Quand il s'agit de construire des chemins d'accès pour fopen_s
, ne faites pas d'hypothèses quant à la disponibilité des lecteurs, chemins d'accès ou partages réseau dans l'environnement d'exécution. Vous pouvez utiliser des barres obliques (/) ou des barres obliques inverses (\) comme séparateurs de répertoires dans un chemin d’accès.
Ces fonctions valident leurs paramètres. Si pFile
, filename
ou mode
est un pointeur Null, ces fonctions génèrent une exception de paramètre non valide, comme décrit dans la validation des paramètres.
Vérifiez toujours la valeur de retour pour voir si la fonction a réussi avant d’effectuer d’autres opérations sur le fichier. Si une erreur se produit, le code d’erreur est retourné et la variable errno
globale est définie. Pour plus d'informations, voir errno
, _doserrno
, _sys_errlist
et _sys_nerr
.
Par défaut, l’état global de cette fonction est limité à l’application. Pour le modifier, consultez l’état global dans le CRT.
Prise en charge d’Unicode
fopen_s
prend en charge les flux de fichiers Unicode. Pour ouvrir un fichier Unicode nouveau ou existant, transmettez un ccs
indicateur qui spécifie l’encodage souhaité, fopen_s
par exemple :
fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");
Les valeurs autorisées de l’indicateur ccs
sont UNICODE
, UTF-8
et UTF-16LE
. Si aucune valeur n’est spécifiée pour ccs
, fopen_s
utilise l’encodage ANSI.
Si le fichier existe déjà et est ouvert pour la lecture ou l’ajout, la marque d’ordre d’octet (BOM), s’il est présent dans le fichier, détermine l’encodage. Le codage BOM est prioritaire sur le codage spécifié par l'indicateur ccs
. Le codage ccs
est utilisé uniquement quand aucune marque BOM n'est présente ou si le fichier est un nouveau fichier.
Remarque
La détection BOM s'applique uniquement aux fichiers ouverts en mode Unicode, autrement dit, en passant l'indicateur ccs
.
Le tableau suivant récapitule les modes des différentes ccs
valeurs d’indicateur qui sont données aux fopen_s
machines virtuelles dans le fichier et pour les machines virtuelles.
Encodages utilisés en fonction de l’indicateur et du ccs
boM
Indicateurccs |
Aucune marque BOM (ou nouveau fichier) | Marque BOM : UTF-8 | Marque BOM : UTF-16 |
---|---|---|---|
UNICODE |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-8 |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-16LE |
UTF-16LE |
UTF-8 |
UTF-16LE |
Une marque BOM est écrite automatiquement dans les fichiers ouverts pour écriture en mode Unicode.
Si mode
c’est "a, ccs=UNICODE"
, "a, ccs=UTF-8"
ou , ou "a, ccs=UTF-16LE"
, fopen_s
tente d’abord d’ouvrir le fichier avec accès en lecture et accès en écriture. En cas de réussite, la fonction lit la marque BOM pour déterminer le codage du fichier ; en cas d'échec, elle utilise le codage par défaut pour le fichier. Dans les deux cas, fopen_s
rouvert le fichier avec un accès en écriture seule. (Ce comportement s’applique uniquement au mode, pas a+
à a
.)
La chaîne de caractères mode
spécifie le type d'accès demandé pour le fichier, comme suit.
mode |
Access |
---|---|
"r" |
Ouvre pour l'accès en lecture. Si le fichier n’existe pas ou est introuvable, l’appel fopen_s échoue. |
"w" |
Ouvre un fichier vide pour l'accès en écriture. Si le fichier spécifié existe, son contenu est détruit. |
"a" |
S'ouvre pour écriture à la fin du fichier (ajout) sans supprimer le marqueur de fin de fichier (EOF) avant que de nouvelles données soient écrites dans le fichier. Crée le fichier s'il n'existe pas. |
"r+" |
Ouvre pour l'accès en lecture et en écriture. Le fichier doit exister. |
"w+" |
Ouvre un fichier vide pour l'accès en lecture et en écriture. Si le fichier existe, son contenu est détruit. |
"a+" |
S'ouvre pour lecture et ajout. L'opération d'ajout inclut la suppression du marqueur EOF avant que de nouvelles données soient écrites dans le fichier. Le marqueur EOF n’est pas restauré une fois l’écriture terminée. Crée le fichier s'il n'existe pas. |
Quand un fichier est ouvert en utilisant le type d'accès "a"
ou "a+"
, toutes les opérations d'écriture se produisent à la fin du fichier. Le pointeur de fichier peut être repositionné à l’aide fseek
ou rewind
, mais il est toujours déplacé vers la fin du fichier avant qu’une opération d’écriture soit effectuée afin que les données existantes ne puissent pas être remplacées.
Le "a"
mode ne supprime pas le marqueur EOF avant de l’ajouter au fichier. Une fois l’ajout effectué, la commande MS-DOS TYPE
affiche uniquement les données jusqu’au marqueur EOF d’origine et non les données ajoutées au fichier. Le mode "a+"
supprime le marqueur EOF avant l'ajout des données au fichier. Après l’ajout, la commande MS-DOS TYPE
affiche toutes les données du fichier. Le "a+"
mode est requis pour l’ajout à un fichier de flux qui est arrêté avec leCTRL
+ marqueur Z EOF.
Lorsque le type d’accès ou "a+"
de "w+"
lecture est spécifié, la lecture et l’écriture "r+"
sont autorisées. (Le fichier est dit ouvert pour « update ». Toutefois, lorsque vous passez de la lecture à l’écriture, l’opération d’entrée doit se trouver sur un marqueur EOF. S’il n’existe aucun marqueur EOF, vous devez utiliser un appel intermédiaire à une fonction de positionnement de fichier. Les fonctions de positionnement de fichier sont fsetpos
, fseek
et rewind
. Quand vous passez de l'écriture à la lecture, vous devez faire un appel intermédiaire à fflush
ou à une fonction de positionnement de fichier.
À compter de C11, vous pouvez ajouter "x"
ou "w+"
"w"
provoquer l’échec de la fonction si le fichier existe, au lieu de le remplacer.
Outre les valeurs précédentes, les caractères suivants peuvent être inclus pour mode
spécifier le mode de traduction pour les caractères de nouvelle ligne :
Modificateur mode |
Mode de traduction |
---|---|
t |
Ouvrir en mode texte (traduit). Les combinaisons de saut de ligne de retour chariot (CR-LF) sont traduites en flux de ligne simples (LF) sur les entrées et les caractères LF sont traduits en combinaisons CR-LF en sortie. Ctrl+Z est interprété comme un caractère de fin de fichier lors de l’entrée. |
b |
Ouvrez en mode binaire (non traduit) ; les traductions impliquant des caractères de retour chariot et de saut de ligne sont supprimées. |
En mode texte (traduit), CTRL
+Z est interprété comme un caractère de fin de fichier lors de l’entrée. Pour les fichiers ouverts pour la lecture/écriture avec "a+"
, fopen_s
recherche unCTRL
+ Z à la fin du fichier et le supprime, si possible. Elle est supprimée, car l’utilisation fseek
et ftell
le déplacement dans un fichier qui se termine par unCTRL
+ Z peuvent entraîner fseek
un comportement incorrect près de la fin du fichier.
En outre, en mode texte, les combinaisons retour chariot/flux de ligne (CRLF) sont traduites en caractères LF (Single Line Feed) sur entrée, et les caractères LF sont traduits en combinaisons CRLF en sortie. Lorsqu'une fonction d'E/S de flux Unicode s'exécute en mode texte (comportement par défaut), on suppose que le flux source ou de destination est une séquence de caractères multioctets. Les fonctions d’entrée de flux Unicode convertissent des caractères multioctets en caractères larges (comme s’il s’agit d’un appel à la mbtowc
fonction). Pour la même raison, les fonctions de flux de sortie Unicode convertissent les caractères larges en caractères multioctets (comme suite à un appel à la fonction wctomb
).
Si t
la b
variable globale est définie ou non, mode
le mode de traduction par défaut est défini par la variable _fmode
globale. Si t
ou b
a l'argument comme préfixe, la fonction échoue et retourne NULL
.
Pour plus d’informations sur l’utilisation de modes texte et binaire dans les E/S de flux Unicode et multioctets, consultez E/S de fichier de texte et de mode binaire et E/S de flux Unicode dans les modes texte et binaire.
Modificateur mode |
Comportement |
---|---|
c |
Activer l'indicateur de validation pour le filename associé, afin que le contenu de la mémoire tampon de fichier soit écrit directement sur disque si fflush ou _flushall est appelé. |
n |
Réinitialisez l’indicateur de validation associé filename à « no-commit ». Cet indicateur est la valeur par défaut. Il remplace également l’indicateur de validation global si vous liez votre programme avec COMMODE.OBJ . L’indicateur de validation global par défaut est « sans validation », sauf si vous liez explicitement votre programme COMMODE.OBJ (voir options de lien). |
N |
Spécifie que le fichier n’est pas hérité par les processus enfants. |
S |
Indique que la mise en cache est optimisée pour, mais non limitée à, l'accès séquentiel à partir du disque. |
R |
Indique que la mise en cache est optimisée pour, mais non limitée à, l'accès aléatoire à partir du disque. |
T |
Spécifie un fichier qui n’est pas écrit sur le disque, sauf si la pression de la mémoire l’exige. |
D |
Spécifie un fichier temporaire qui est supprimé lorsque le dernier pointeur de fichier vers celui-ci est fermé. |
ccs=UNICODE |
Spécifie UNICODE comme jeu de caractères encodé à utiliser pour ce fichier. Laissez ce paramètre non spécifié si vous souhaitez bénéficier de l'encodage ANSI. |
ccs=UTF-8 |
Spécifie UTF-8 comme jeu de caractères encodé à utiliser pour ce fichier. Laissez ce paramètre non spécifié si vous souhaitez bénéficier de l'encodage ANSI. |
ccs=UTF-16LE |
Spécifie UTF-16LE comme jeu de caractères encodé à utiliser pour ce fichier. Laissez ce paramètre non spécifié si vous souhaitez bénéficier de l'encodage ANSI. |
Caractères valides pour la mode
chaîne utilisée dans fopen_s
et _fdopen
correspondent aux oflag
arguments utilisés dans _open
et _sopen
, comme suit.
Caractères dans la chaîne mode |
Valeur oflag équivalente pour _open /_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (généralement _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (généralement _O_RDWR | _O_APPEND | _O_CREAT ) |
R |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (généralement _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (généralement **_O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT (traduit) |
c |
Aucun(e) |
n |
None |
D |
_O_TEMPORARY |
R |
_O_RANDOM |
S |
_O_SEQUENTIAL |
T |
_O_SHORTLIVED |
ccs=UNICODE |
_O_WTEXT |
ccs=UTF-8 |
_O_UTF8 |
ccs=UTF-16LE |
_O_UTF16 |
Les c
extensions , , S
R
t
, n
, T
, et D
mode
les options Microsoft sont pour fopen_s
et _wfopen_s
ne doivent pas être utilisées lorsque vous souhaitez la portabilité ANSI.
Si vous utilisez rb
le mode, les fichiers Win32 mappés en mémoire peuvent également être une option si vous n’avez pas besoin de porter votre code, vous vous attendez à lire une grande partie du fichier, ou vous ne vous souciez pas des performances réseau.
En ce qui concerne T
et D
:
T
évite d’écrire le fichier sur le disque tant que la pression de la mémoire ne le nécessite pas. Pour plus d’informations, consultezFILE_ATTRIBUTE_TEMPORARY
les constantes d’attributs de fichier et ce billet de blog uniquement temporaire.D
spécifie un fichier standard écrit sur le disque. La différence est qu’elle est automatiquement supprimée lorsqu’elle est fermée. Vous pouvez combinerTD
pour obtenir les deux sémantiques.
Spécifications
Fonction | En-tête requis | En-tête C++ |
---|---|---|
fopen_s |
<stdio.h> |
<cstdio> |
_wfopen_s |
<stdio.h> ou <wchar.h> |
<cstdio> |
Pour plus d’informations sur la conformité aux normes et les conventions d’affectation de noms dans la bibliothèque runtime C, consultez Compatibilité.
Mappages de routines de texte générique
Routine <tchar.h> |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_tfopen_s |
fopen_s |
fopen_s |
_wfopen_s |
Bibliothèques
Toutes les versions des bibliothèques Runtime C.
Exemple
// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.
#include <stdio.h>
FILE *stream, *stream2;
int main( void )
{
errno_t err;
// Open for read (will fail if file "crt_fopen_s.c" doesn't exist)
err = fopen_s( &stream, "crt_fopen_s.c", "r" );
if( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was opened\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not opened\n" );
}
// Open for write
err = fopen_s( &stream2, "data2", "w+, ccs=UTF-8" );
if( err == 0 )
{
printf( "The file 'data2' was opened\n" );
}
else
{
printf( "The file 'data2' was not opened\n" );
}
// Close stream if it isn't NULL
if( stream )
{
err = fclose( stream );
if ( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was closed\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not closed\n" );
}
}
// All other files are closed:
int numclosed = _fcloseall( );
printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1
Voir aussi
E/S de flux
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode