fopen, fdopen, freopen - Fonctions d'ouverture de flux.
La fonction
fopen
ouvre le fichier dont le nom est contenu dans la chaine pointée par
path
et lui associe un flux.
L'argument
mode
pointe vers une chaîne commençant par l'une des séquences suivantes
(d'autres caractères peuvent suivre la séquence) :
- r
-
Ouvre le fichier en lecture. Le pointeur de flux est placé au début du
fichier.
- r+
-
Ouvre le fichier en lecture et écriture. Le pointeur de flux est placé au début du
fichier.
- w
-
Ouvre le fichier en écriture. Le fichier est créé s'il n'existait pas.
S'il existait déjà, sa longueur est ramenée à 0.
Le pointeur de flux est placé au début du fichier.
- w+
-
Ouvre le fichier en lecture et écriture. Le fichier est créé s'il n'existait pas.
S'il existait deja, sa longueur est ramenée à 0.
Le pointeur de flux est placé au début du fichier.
- a
-
Ouvre le fichier en ajout (écriture à la fin du fichier). Le fichier est créé s'il n'existait pas. Le pointeur
de flux est placé à la fin du fichier.
- a+
-
Ouvre le fichier en lecture et ajout (écriture en fin de fichier).
Le fichier est créé s'il n'existait pas. Le pointeur
de flux est placé à la fin du fichier.
La chaîne
mode
peut également inclure la lettre ``b'' comme 3ème caractere, ou même entre
les deux caractères d'une des séquences à 2 lettres vues ci-dessus.
Ce mode sert uniquement à assurer la compatibilité avec ANSI X3.159-1989
(``ANSI 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 de texte et les fichiers binaires différement, et l'ajout du ``b''
peut être une bonne idée si vous faites des entrées-sorties binaires et que
votre programme risque d'être porté sur un environnement non-Unix).
Tout fichier créé aura le mode
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
(0666), qui sera ensuite modifié par la valeur d'umask du processus. Voir
umask(2).
Les lectures et les écritures peuvent être mélangées sur les flux en lecture
et écriture, dans un ordre quelconque, et sans besoin de positionnement entre
les entrées et les sorties, à moins qu'une lecture atteigne la fin du fichier.
(Sinon sur certains systèmes la lecture peut renvoyer les données provenant
d'une écriture autre que la dernière).
Une bonne habitude consiste donc à intercaler un
fseek
ou
fgetpos
entre les lectures et les écritures sur le même flux. Ces opérations peuvent
être visiblement sans effet comme fseek(..., 0L, SEEK_CUR) et ne servant que
pour l'effet de bord de synchronisation.
Ouvrir un fichier en mode ajout (
a en premier caractère dans le
mode)
feront agir toutes les opérations d'écriture à la fin du flux, comme
si elles étaient précédées par un appel
-
fseek(stream,0,SEEK_END);
systèmatique.
La fonction
fdopen
associe un flux avec un descripteur de fichier
fildes
existant.
Le
mode
du flux ("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
fildes,
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 n'est pas dupliqué par
dup(2), et sera refermé lorsque
le flux créé par
fdopen
sera refermé.
L'appel de
fdopen
sur un objet en mémoire partagée est indéfini.
La fonction
freopen
ouvre le fichier dont le nom se trouve dans la chaîne de caractères pointée par
path
et lui associe le flux pointé par
stream.
Le flux original, s'il existe, est fermé. L'argument
mode
est utilisé exactement comme avec
fopen.
La principale utilisation de
freopen
est de modifier le fichier associé avec les flux standards de texte
(
stderr,
stdin, ou
stdout).
- EINVAL
-
Le
mode
fourni à
fopen,
fdopen,
ou
freopen
était invalide.
Les fonctions
fopen,
fdopen
et
freopen
peuvent également échouer et positionner dans
errno
une des erreurs susceptibles de se produire avec
malloc(3).
La fonction
fopen
peut aussi échouer et positionner dans
errno
une des erreurs susceptibles de se produire avec
open(2).
La fonction
fdopen
peut aussi échouer et positionner dans
errno
une des erreurs susceptibles de se produire avec
fcntl(2).
La fonction
freopen
peut aussi échouer et positionner dans
errno
une des erreurs susceptibles de se produire avec
open(2),
fclose(3)
et
fflush(3).
Christophe Blaess, 1996-2003.