fopen(3) Library Functions Manual fopen(3) NOM fopen, fdopen, freopen - Fonctions d'ouverture de flux BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include 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 fonctionnalites pour la glibc (consulter feature_test_macros(7)) : fdopen(): _POSIX_C_SOURCE DESCRIPTION La fonction fopen() ouvre le fichier dont le nom est specifie dans la chaine pointee par chemin et lui associe un flux. L'argument mode pointe vers une chaine commencant par l'une des sequences suivantes (eventuellement suivie de caracteres supplementaires, conformement a la description ci-dessous) : r Ouvrir le fichier en lecture. Le pointeur de flux est place au debut du fichier. r+ Ouvrir le fichier en lecture et ecriture. Le pointeur de flux est place au debut du fichier. w Tronquer le fichier a zero octet ou creer le fichier en ecriture. Le pointeur de flux est place au debut du fichier. w+ Ouvrir le fichier en lecture et ecriture. Le fichier est cree s'il n'existe pas. S'il existe deja, sa taille est ramenee a 0. Le pointeur de flux est place au debut du fichier. a Ouvrir le fichier en ajout (ecriture a la fin du fichier). Le fichier est cree s'il n'existe pas. Le pointeur de flux est place a la fin du fichier. a+ Ouvrir le fichier en lecture et ajout (ecriture en fin de fichier). Le fichier est cree s'il n'existe pas. Les donnees sont toujours ajoutees en fin de fichier. POSIX ne dit rien quant a la position initiale de lecture lorsqu'on utilise ce mode. Pour la glibc, la position initiale de lecture est le debut du fichier, mais pour Android, BSD et MacOS, elle est a la fin du fichier. La chaine mode peut egalement inclure la lettre << b >> comme dernier caractere ou meme entre les deux caracteres d'une des sequences a deux caracteres vues ci-dessus. Ce mode sert uniquement a assurer la compatibilite avec ISO C et n'a aucun effet. Le << b >> est ignore sur tous les systemes compatibles POSIX, y compris Linux (d'autres systemes peuvent traiter les fichiers textes et les fichiers binaires differemment, et l'ajout du << b >> peut etre une bonne idee si vous faites des entrees/sorties sur un fichier binaire et que votre programme risque d'etre porte sur un environnement non UNIX). Consultez la section NOTES ci-dessous pour des details sur les extensions de la glibc pour mode. Tout fichier cree 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 ecritures peuvent etre melangees sur les flux en lecture et ecriture, dans un ordre quelconque. Notez que AINSI C requiert qu'une fonction de positionnement dans le fichier soit appelee entre une lecture et une ecriture, a moins que l'operation de lecture n'atteigne la fin du fichier (si cette condition n'est pas rencontree, alors une lecture est permise pour renvoyer le resultat d'une ecriture autre que la derniere). Une bonne habitude (souvent necessaire sous Linux) consiste donc a intercaler un fseek(3) ou fsetpos(3) entre les lectures et les ecritures sur un flux de ce type. Cette operation peut etre une operation 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 caractere dans mode) fera que toutes les operations d'ecriture vers ce flux s'effectueront a la fin du fichier, comme si elles etaient precedees par l'appel : fseek(stream, 0, SEEK_END); Le descripteur de fichier associe a ce flux est ouvert dans le meme mode que s'il avait ete ouvert par un appel a 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 etre compatible avec celui du descripteur de fichier. L'indicateur de position du nouveau flux prend la meme valeur que celui de fd et les indicateurs d'erreur et de fin de fichier sont effaces. Les modes << w >> et << w+ >> ne tronquent pas le fichier. Le descripteur de fichier n'est pas duplique et sera ferme lorsque le flux cree par fdopen() sera ferme. Le resultat d'un appel a fdopen() sur un objet en memoire partagee est indefini. freopen() La fonction freopen() ouvre le fichier dont le nom se trouve dans la chaine de caracteres pointee par chemin et lui associe le flux pointe par flux. Le flux original, s'il existe, est ferme. L'argument mode est utilise exactement comme dans la fonction fopen(). Si l'argument chemin contient un pointeur NULL, freopen() change le mode du flux pour celui specifie dans mode ; cela fait, freopen() reouvre le fichier associe au flux considere. La specification de ce comportement a ete ajoutee dans la norme C99 qui stipule : Dans ce cas, le descripteur de fichier associe au flux n'a pas besoin d'etre ferme si l'appel a freopen() reussit. La liste des changements eventuels de mode autorises ainsi que les circonstances de ces changements dependent de l'implementation. freopen() est principalement utilise pour changer le fichier associe a un flux de texte standard (stderr, stdin ou stdout). VALEUR RENVOYEE En cas de succes, fopen(), fdopen() et freopen() renvoient un pointeur de type FILE. Sinon, elles renvoient NULL et errno est defini pour indiquer l'erreur. ERREURS EINVAL Le mode fourni a fopen(), fdopen() ou freopen() n'etait pas valable. Les fonctions fopen(), fdopen() et freopen() peuvent egalement echouer et definir dans errno une des erreurs specifiees pour malloc(3). La fonction fopen() peut aussi echouer et definir dans errno une des erreurs specifiees pour open(2). La fonction fdopen() peut aussi echouer et definir dans errno une des erreurs specifiees pour fcntl(2). La fonction freopen() peut aussi echouer et definir dans errno une des erreurs specifiees pour open(2), fclose(3) et fflush(3). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |fopen(), fdopen(), freopen() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ STANDARDS fopen() freopen() C11, POSIX.1-2008. fdopen() POSIX.1-2008. HISTORIQUE fopen() freopen() POSIX.1-2001, C89. fdopen() POSIX.1-2001. NOTES Notes de la glibc La bibliotheque GNU C permet les extensions suivantes pour la chaine specifiee par mode : c (depuis la glibc 2.3.3) Ne pas faire de l'operation d'ouverture ou des operations de lecture et ecriture ulterieures, des points d'annulation de thread. Cet attribut est ignore 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 ignore pour fdopen(). m (depuis la glibc 2.3) Essayer d'acceder au fichier avec mmap(2) au lieu des appels systeme d'entrees/sorties (read(2), write(2)). Actuellement, mmap(2) n'est utilise 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 deja, fopen() echoue et errno est definie a EEXIST. Cet attribut est ignore par fdopen(). En plus des caracteres ci-dessus, fopen() et freopen() acceptent la syntaxe suivante dans mode : ,ccs=chaine La chaine specifiee est consideree comme le nom d'un jeu de caracteres codes et le flux est marque comme oriente caracteres larges. Ensuite, les fonctions internes de conversion convertissent les E/S depuis et vers ce jeu de caracteres. Si la syntaxe ,ccs=chaine n'est pas indiquee, alors l'orientation des caracteres larges du flux est determinee par la premiere operation sur le fichier. S'il s'agit une operation de caracteres larges, le flux est marque comme oriente caracteres larges et les fonctions pour convertir vers le jeu de caracteres codes sont chargees. BOGUES Lors de l'analyse des caracteres d'attribut individuel dans mode (c'est-a-dire les caracteres precedant l'indication << ccs >>), l'implementation de la glibc de fopen() et freopen() limite le nombre de caracteres examines dans mode a 7 (ou, avant la glibc 2.14, a 6, ce qui n'etait pas suffisant pour inclure d'eventuelles specifications comme << rb+cmxe >>). L'implementation actuelle de fdopen() analyse au plus 5 caracteres de mode. VOIR AUSSI open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Lucien Gentis Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 fopen(3)