std:: FILE
|
Défini dans l'en-tête
<cstdio>
|
||
|
typedef
/* non spécifié */
FILE
;
|
||
Chaque
std::FILE
objet désigne un flux C.
La norme C (référencée par la norme C++) ne spécifie pas si
std::FILE
est un type d'objet complet. Bien qu'il puisse être possible de copier un
std::FILE
valide, l'utilisation d'un pointeur vers une telle copie comme argument pour une fonction d'E/S invoque un comportement non spécifié. En d'autres termes,
std::FILE
peut être sémantiquement non copiable.
Les flux d'E/S peuvent être utilisés à la fois pour les entrées et sorties formatées et non formatées. De plus, les fonctions qui gèrent les entrées et sorties peuvent également être sensibles aux paramètres régionaux, de sorte que les conversions larges/multioctets sont effectuées si nécessaire.
Table des matières |
État du flux
Outre les informations spécifiques au système nécessaires pour accéder au périphérique (
par exemple,
un descripteur de fichier POSIX), chaque objet
std::FILE
contient directement ou indirectement les éléments suivants :
- Largeur de caractère : unset, narrow, ou wide.
- État d'analyse pour les conversions entre caractères multioctets et caractères larges (un objet de type std::mbstate_t )
- État de la mise en mémoire tampon : unbuffered, line-buffered, fully buffered.
- Le tampon, qui peut être remplacé par un tampon externe fourni par l'utilisateur.
- Mode d'E/S : input, output, ou update (à la fois input et output).
- Indicateur de mode binaire/texte.
- Indicateur d'état de fin de fichier.
- Indicateur d'état d'erreur.
- Indicateur de position de fichier, accessible en tant qu'objet de type std::fpos_t , qui, pour les flux larges, inclut l'état d'analyse.
- (C++17) Verrou réentrant utilisé pour prévenir les conditions de concurrence lorsque plusieurs threads lisent, écrivent, positionnent ou interrogent la position d'un flux.
Orientation étroite et large
Un flux nouvellement ouvert n'a pas d'orientation. Le premier appel à std::fwide ou à toute fonction d'E/S établit l'orientation : une fonction d'E/S large rend le flux orienté large ; une fonction d'E/S étroite rend le flux orienté étroit. Une fois définie, l'orientation ne peut être modifiée qu'avec std::freopen . Les fonctions d'E/S étroites ne peuvent pas être appelées sur un flux orienté large ; les fonctions d'E/S larges ne peuvent pas être appelées sur un flux orienté étroit. Les fonctions d'E/S larges convertissent entre les caractères larges et les caractères multioctets comme si elles appelaient std::mbrtowc ou std::wcrtomb avec l'état de conversion décrit par le flux. Contrairement aux chaînes de caractères multioctets valides dans un programme, les séquences de caractères multioctets dans le fichier peuvent contenir des caractères nuls intégrés et ne doivent pas nécessairement commencer ou se terminer dans l'état de décalage initial.
L'état de conversion d'un flux avec orientation large est établi par les paramètres régionaux C qui sont installés au moment où l'orientation du flux est définie.
Modes binaire et texte
Un flux de texte est une séquence ordonnée de caractères qui peut être composée en lignes ; une ligne peut être décomposée en zéro ou plusieurs caractères plus un caractère de fin de ligne ' \n ' (« newline »). Le fait que la dernière ligne nécessite un ' \n ' final est défini par l'implémentation. De plus, des caractères peuvent devoir être ajoutés, modifiés ou supprimés lors de l'entrée et de la sortie pour se conformer aux conventions de représentation du texte dans le système d'exploitation (en particulier, les flux C sous Windows convertissent ' \n ' en ' \r \n ' en sortie, et convertissent ' \r \n ' en ' \n ' en entrée).
Les données lues à partir d'un flux texte sont garanties d'être comparables comme égales aux données précédemment écrites dans ce flux uniquement si chacune des conditions suivantes est vraie :
- Les données consistent uniquement en caractères d'impression et/ou les caractères de contrôle ' \t ' et ' \n ' (en particulier, sur le système d'exploitation Windows, le caractère ' \0 x1A' termine l'entrée).
- Aucun caractère ' \n ' n'est immédiatement précédé par des caractères d'espacement (de tels caractères d'espacement peuvent disparaître lorsque cette sortie est ultérieurement lue en entrée).
- Le dernier caractère est ' \n ' .
Un flux binaire est une séquence ordonnée de caractères qui peut enregistrer de manière transparente des données internes. Les données lues depuis un flux binaire sont toujours égales aux données précédemment écrites dans ce flux, sauf qu'une implémentation est autorisée à ajouter un nombre indéterminé de caractères nuls à la fin du flux. Un flux binaire large n'a pas besoin de se terminer dans l'état de décalage initial.
Notes
POSIX exige explicitement que la facette
LC_CTYPE
des paramètres régionaux C actuellement installés soit stockée dans l'objet
FILE
au moment où l'orientation du flux devient large ; POSIX exige que cette facette
LC_CTYPE
soit utilisée pour toutes les entrées/sorties futures sur ce flux jusqu'à ce que l'orientation soit modifiée, indépendamment de tout appel ultérieur à
std::setlocale
.
Il est prévu que chaque ligne de texte soit composée de données essentiellement lisibles par l'homme. Les implémentations POSIX ne font pas de distinction entre les flux de texte et binaires (il n'y a pas de mappage spécial pour ' \n ' ou tout autre caractère).
Voir aussi
|
abstrait un périphérique brut
(modèle de classe) |
|
|
implémente un périphérique de fichier brut
(modèle de classe) |
|
|
expression de type
FILE
*
associée au flux d'entrée
expression de type FILE * associée au flux de sortie expression de type FILE * associée au flux de sortie d'erreur (constante macro) |
|
|
Documentation C
pour
FILE
|
|