NOM
fopen, fdopen, freopen - Fonctions d'ouverture de fluxBIBLIOTHÈ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.
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.
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().
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 <[email protected]>, Thierry Vignaud <[email protected]>, François Micaux, Alain Portal <[email protected]>, Jean-Philippe Guérard <[email protected]>, Jean-Luc Coulon (f5ibh) <[email protected]>, Julien Cristau <[email protected]>, Thomas Huriaux <[email protected]>, Nicolas François <[email protected]>, Florentin Duneau <[email protected]>, Simon Paillard <[email protected]>, Denis Barbier <[email protected]>, David Prévot <[email protected]>, Frédéric Hantrais <[email protected]> et Lucien Gentis <[email protected]> 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 à [email protected]5 février 2023 | Pages du manuel de Linux 6.03 |