fopen
Section: C Library Functions (3)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
fopen, fdopen, freopen - Fonctions d'ouverture de flux
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <stdio.h>
FILE *fopen(const char *restrict chemin, const char *restrict mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *restrict chemin, const char *restrict mode,
FILE *restrict flux);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
fdopen():
_POSIX_C_SOURCE
DESCRIPTION
La fonction fopen() ouvre le fichier dont le nom est spécifié dans la
chaîne pointée par chemin et lui associe un flux.
L'argument mode pointe vers une chaîne commençant par l'une des séquences
suivantes (éventuellement suivie de caractères supplémentaires, conformément
à la description ci-dessous) :
- r
-
Ouvrir le fichier en lecture. Le pointeur de flux est placé au début du
fichier.
- r+
-
Ouvrir le fichier en lecture et écriture. Le pointeur de flux est placé au
début du fichier.
- w
-
Tronquer le fichier à zéro octet ou créer le fichier en écriture. Le
pointeur de flux est placé au début du fichier.
- w+
-
Ouvrir le fichier en lecture et écriture. Le fichier est créé s'il n'existe
pas. S'il existe déjà, sa taille est ramenée à 0. Le pointeur de flux est
placé au début du fichier.
- a
-
Ouvrir le fichier en ajout (écriture à la fin du fichier). Le fichier est
créé s'il n'existe pas. Le pointeur de flux est placé à la fin du fichier.
- a+
-
Ouvrir le fichier en lecture et ajout (écriture en fin de fichier). Le
fichier est créé s'il n'existe pas. Les données sont toujours ajoutées en
fin de fichier. POSIX ne dit rien quant à la position initiale de lecture
lorsqu'on utilise ce mode. Pour la glibc, la position initiale de lecture
est le début du fichier, mais pour Android, BSD et MacOS, elle est à la fin
du fichier.
La chaîne mode peut également inclure la lettre « b » comme dernier
caractère ou même entre les deux caractères d'une des séquences à deux
caractères vues ci-dessus. Ce mode sert uniquement à assurer la
compatibilité avec ISO C et n'a aucun effet. Le « b » est ignoré sur tous
les systèmes compatibles POSIX, y compris Linux (d'autres systèmes peuvent
traiter les fichiers textes et les fichiers binaires différemment, et
l'ajout du « b » peut être une bonne idée si vous faites des
entrées/sorties sur un fichier binaire et que votre programme risque d'être
porté sur un environnement non UNIX).
Consultez la section NOTES ci-dessous pour des détails sur les extensions de
la glibc pour mode.
Tout fichier créé aura le mode S_IRUSR | S_IWUSR | S_IRGRP |
S_IWGRP | S_IROTH | S_IWOTH (0666), en fonction de la valeur
d'umask du processus. Consultez umask(2).
Les lectures et les écritures peuvent être mélangées sur les flux en lecture
et écriture, dans un ordre quelconque. Notez que AINSI C requiert qu'une
fonction de positionnement dans le fichier soit appelée entre une lecture et
une écriture, à moins que l'opération de lecture n'atteigne la fin du
fichier (si cette condition n'est pas rencontrée, alors une lecture est
permise pour renvoyer le résultat d'une écriture autre que la dernière). Une
bonne habitude (souvent nécessaire sous Linux) consiste donc à intercaler un
fseek(3) ou fsetpos(3) entre les lectures et les écritures sur un flux
de ce type. Cette opération peut être une opération sans effet comme
fseek(..., 0L, SEEK_CUR) et dont l'effet de bord est une synchronisation.
Ouvrir un fichier en mode ajout (a comme premier caractère dans mode)
fera que toutes les opérations d'écriture vers ce flux s'effectueront à la
fin du fichier, comme si elles étaient précédées par l'appel :
fseek(stream, 0, SEEK_END);
Le descripteur de fichier associé à ce flux est ouvert dans le même mode que
s'il avait été ouvert par un appel à open(2) avec les drapeaux suivants :
-
Mode de fopen() | Drapeaux d’open()
|
r | O_RDONLY
|
w | O_WRONLY | O_CREAT | O_TRUNC
|
a | O_WRONLY | O_CREAT | O_APPEND
|
r+ | O_RDWR
|
w+ | O_RDWR | O_CREAT | O_TRUNC
|
a+ | O_RDWR | O_CREAT | O_APPEND
|
fdopen()
La fonction fdopen() associe un flux avec un descripteur de fichier fd
existant. Le mode du flux (une des valeurs « r », « "r+ », « w »,
« w+ », « a » ou « a+ ») doit être compatible avec celui du
descripteur de fichier. L'indicateur de position du nouveau flux prend la
même valeur que celui de fd et les indicateurs d'erreur et de fin de
fichier sont effacés. Les modes « w » et « w+ » ne tronquent pas le
fichier. Le descripteur de fichier n'est pas dupliqué et sera fermé lorsque
le flux créé par fdopen() sera fermé. Le résultat d'un appel à
fdopen() sur un objet en mémoire partagée est indéfini.
freopen()
La fonction freopen() ouvre le fichier dont le nom se trouve dans la
chaîne de caractères pointée par chemin et lui associe le flux pointé par
flux. Le flux original, s'il existe, est fermé. L'argument mode est
utilisé exactement comme dans la fonction fopen().
Si l'argument chemin contient un pointeur NULL, freopen() change le
mode du flux pour celui spécifié dans mode ; cela fait, freopen()
réouvre le fichier associé au flux considéré. La spécification de ce
comportement a été ajoutée dans la norme C99 qui stipule :
-
Dans ce cas, le descripteur de fichier associé au flux n'a pas besoin d'être
fermé si l'appel à freopen() réussit. La liste des changements éventuels
de mode autorisés ainsi que les circonstances de ces changements dépendent
de l'implémentation.
freopen() est principalement utilisé pour changer le fichier associé à un
flux de texte standard (stderr, stdin ou stdout).
VALEUR RENVOYÉE
En cas de succès, fopen(), fdopen() et freopen() renvoient un
pointeur de type FILE. Sinon, elles renvoient NULL et errno est défini
pour indiquer l'erreur.
ERREURS
- EINVAL
-
Le mode fourni à fopen(), fdopen() ou freopen() n'était pas
valable.
Les fonctions fopen(), fdopen() et freopen() peuvent également
échouer et définir dans errno une des erreurs spécifiées pour
malloc(3).
La fonction fopen() peut aussi échouer et définir dans errno une des
erreurs spécifiées pour open(2).
La fonction fdopen() peut aussi échouer et définir dans errno une des
erreurs spécifiées pour fcntl(2).
La fonction freopen() peut aussi échouer et définir dans errno une des
erreurs spécifiées pour open(2), fclose(3) et fflush(3).
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface | Attribut | Valeur
|
fopen(),
fdopen(),
freopen()
| Sécurité des threads | MT-Safe
|
STANDARDS
fopen(), freopen() : POSIX.1-2001, POSIX.1-2008, C99.
fdopen() : POSIX.1-2001, POSIX.1-2008.
NOTES
Notes de la glibc
La bibliothèque GNU C permet les extensions suivantes pour la chaîne
spécifiée par mode :
- c (depuis la glibc 2.3.3)
-
Ne pas faire de l'opération d'ouverture ou des opérations de lecture et
écriture ultérieures, des points d'annulation de thread. Cet attribut est
ignoré pour fdopen().
- e (depuis la glibc 2.7)
-
Ouvrir le fichier avec l'attribut O_CLOEXEC. Consultez open(2) pour de
plus amples renseignements. Cet attribut est ignoré pour fdopen().
- m (depuis la glibc 2.3)
-
Essayer d'accéder au fichier avec mmap(2) au lieu des appels système
d'entrées/sorties (read(2), write(2)). Actuellement, mmap(2) n'est
utilisé que pour un fichier ouvert en lecture.
- x
-
Uniquement ouvrir le fichier (comme avec l'attribut O_EXCL de
open(2)). Si le fichier existe déjà, fopen() échoue et errno est
définie à EEXIST. Cet attribut est ignoré par fdopen().
En plus des caractères ci-dessus, fopen() et freopen() acceptent la
syntaxe suivante dans mode :
,ccs=chaîne
La chaîne spécifiée est considérée comme le nom d'un jeu de caractères
codés et le flux est marqué comme orienté caractères larges. Ensuite, les
fonctions internes de conversion convertissent les E/S depuis et vers ce jeu
de caractères. Si la syntaxe ,ccs=chaîne n'est pas indiquée, alors
l'orientation des caractères larges du flux est déterminée par la première
opération sur le fichier. S'il s'agit une opération de caractères larges, le
flux est marqué comme orienté caractères larges et les fonctions pour
convertir vers le jeu de caractères codés sont chargées.
BOGUES
Lors de l'analyse des caractères d'attribut individuel dans mode
(c'est-à-dire les caractères précédant l'indication « ccs »),
l'implémentation de la glibc de fopen() et freopen() limite le nombre
de caractères examinés dans mode à 7 (ou, avant la glibc 2.14, à 6,
ce qui n'était pas suffisant pour inclure d'éventuelles spécifications comme
« rb+cmxe »). L'implémentation actuelle de fdopen() analyse au plus
5 caractères de mode.
VOIR AUSSI
open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3),
open_memstream(3)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>,
Frédéric Hantrais <fhantrais@gmail.com>
et
Lucien Gentis <lucien.gentis@waika9.com>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- fdopen()
-
- freopen()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- ATTRIBUTS
-
- STANDARDS
-
- NOTES
-
- Notes de la glibc
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:37:57 GMT, May 18, 2024