Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
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 :

  1. Largeur de caractère : unset, narrow, ou wide.
  2. État d'analyse pour les conversions entre caractères multioctets et caractères larges (un objet de type std::mbstate_t )
  3. État de la mise en mémoire tampon : unbuffered, line-buffered, fully buffered.
  4. Le tampon, qui peut être remplacé par un tampon externe fourni par l'utilisateur.
  5. Mode d'E/S : input, output, ou update (à la fois input et output).
  6. Indicateur de mode binaire/texte.
  7. Indicateur d'état de fin de fichier.
  8. Indicateur d'état d'erreur.
  9. 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.
  10. (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)