fopen, fopen_s
De fr.cppreference.net
| Défini dans l'en-tête <stdio.h>
|
||
FILE* fopen( const char* filename, const char* mode );
|
(1) | (jusqu'à C99) |
FILE* fopen( const char* restrict filename, const char* restrict mode );
|
(depuis C99) | |
errno_t fopen_s( FILE* restrict* restrict streamptr,
const char* restrict filename,
const char* restrict mode );
|
(2) | (depuis C11) |
1) Ouvre un fichier indiqué par
filename et renvoie un pointeur vers le flux de fichier associé à ce fichier. mode est utilisé pour déterminer le mode d'accès au fichier.2) Identique à (1), sauf que le pointeur vers le flux de fichier est écrit dans
streamptr et les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contrainte actuellement installée :
streamptrest un pointeur nulfilenameest un pointeur nulmodeest un pointeur nul
fopen_s n'est garanti 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 mode d'accès au fichier |
| streamptr | - | 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 pour la lecture | lire depuis le début | échec à l'ouverture |
"w"
|
écriture | Créer un fichier pour l'é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 en lecture/écriture | détruire le contenu | créer un nouveau |
"a+"
|
ajout étendu | Ouvrir un fichier en lecture/écriture | écrire à la fin | créer un nouveau |
Le drapeau de mode d'accès au fichier "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 sur Windows il désactive le traitement spécial de '\n' et '\x1A'. Dans les modes d'accès aux fichiers en ajout, les données sont écrites à la fin du fichier indépendamment de la position actuelle de l'indicateur de position dans le fichier. | ||||
| Le comportement est indéfini si le mode n'est pas l'une des chaînes listées ci-dessus. Certaines implémentations définissent des modes supplémentaires supportés (par exemple Windows). | ||||
En mode mise à jour ('+'), les entrées et sorties peuvent être effectuées, mais la sortie ne peut pas être suivie d'une entrée sans un appel intermédiaire à fflush, fseek, fsetpos ou rewind, et l'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 lorsque le mode texte est spécifié.
| ||||
Le drapeau de mode d'accès au fichier "x" peut être optionnellement ajouté 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 au fichier pour tout fichier créé avec "w" ou "a" empêchent les autres utilisateurs d'y accéder. Le drapeau de mode d'accès au fichier "u" peut être optionnellement ajouté au début de tout spécificateur commençant par "w" ou "a", pour activer les permissions par défaut de fopen. (C11)
| ||||
Valeur de retour
1) En cas de succès, renvoie un pointeur vers le nouveau flux de fichier. Le flux est entièrement tamponné sauf si
filename fait référence à un périphérique interactif. En cas d'erreur, renvoie un pointeur nul. POSIX exige POSIX exige] que errno soit défini dans ce cas.2) En cas de succès, renvoie zéro et un pointeur vers le nouveau flux de fichier est écrit dans
*streamptr. En cas d'erreur, renvoie un code d'erreur non nul et écrit le pointeur nul dans *streamptr (sauf si streamptr est lui-même un pointeur nul).Notes
Le format de filename est défini par l'implémentation et ne fait pas nécessairement référence à un fichier (par exemple, il peut s'agir de la console ou d'un autre dispositif accessible via l'API du système de fichiers). Sur les plateformes qui les supportent, filename peut inclure un chemin absolu ou relatif du système de fichiers.
Exemple
Exécuter ce code
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL);
int is_ok = EXIT_FAILURE;
FILE* fp = fopen(fname, "w+");
if (!fp)
{
perror("File opening failed");
return is_ok;
}
fputs("Hello, world!\n", fp);
rewind(fp);
int c; // note: int, not char, required to handle EOF
while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop
putchar(c);
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
{
puts("End of file is reached successfully");
is_ok = EXIT_SUCCESS;
}
fclose(fp);
remove(fname);
return is_ok;
}
Sortie possible :
Hello, world!
End of file is reached successfully
Références
- Norme C23 (ISO/IEC 9899:2024) :
- 7.21.5.3 La fonction fopen (p: TBD)
- K.3.5.2.1 La fonction fopen_s (p: TBD)
- Norme C17 (ISO/IEC 9899:2018) :
- 7.21.5.3 La fonction fopen (p: 223-224)
- K.3.5.2.1 La fonction fopen_s (p: 428-429)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.21.5.3 La fonction fopen (p: 305-306)
- K.3.5.2.1 La fonction fopen_s (p: 588-590)
- Norme C99 (ISO/IEC 9899:1999) :
- 7.19.5.3 La fonction fopen (p: 271-272)
- Norme C89/C90 (ISO/IEC 9899:1990) :
- 4.9.5.3 La fonction fopen
Voir aussi
| ferme un fichier (fonction) | |
| synchronise un flux de sortie avec le fichier réel (fonction) | |
(C11) |
ouvre un flux existant avec un nom différent (fonction) |
Documentation C++ pour fopen
| |