Namespaces
Variants

FILE

From cppreference.net
< c ‎ | io
Défini dans l'en-tête <stdio.h>
typedef /* non spécifié */ FILE ;

Chaque FILE objet désigne un flux C.

La norme C ne spécifie pas si FILE est un type d'objet complet. Bien qu'il puisse être possible de copier un 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, 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

En plus des informations spécifiques au système nécessaires pour accéder au périphérique ( par exemple, un descripteur de fichier POSIX), chaque objet FILE contient directement ou indirectement les éléments suivants :

  1. (C95) Largeur de caractère : non définie, étroite ou large.
  2. (C95) État d'analyse pour les conversions entre caractères multioctets et caractères larges (un objet de type mbstate_t )
  3. État de la mise en mémoire tampon : sans tampon, avec tampon de ligne, avec tampon complet.
  4. Le tampon, qui peut être remplacé par un tampon externe fourni par l'utilisateur.
  5. Mode d'E/S : entrée, sortie ou mise à jour (entrée et sortie).
  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 fpos_t , qui, pour les flux larges, inclut l'état d'analyse.
  10. (C11) Verrou réentrant utilisé pour empêcher les conditions de compétition 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 à fwide ou à toute fonction d'E/S établit l'orientation : une fonction d'E/S larges rend le flux orienté large ; une fonction d'E/S étroites rend le flux orienté étroit. Une fois définie, l'orientation ne peut être modifiée qu'avec 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 mbrtowc ou 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 incorporé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 pouvant ê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 ' terminal 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 imprimables 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 (ces 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 le LC_CTYPE de la locale C actuellement installée soit stocké dans l'objet FILE au moment où l'orientation du flux devient large ; POSIX exige que ce LC_CTYPE soit utilisé 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 à setlocale .

Il est prévu que chaque ligne de texte soit composée de données essentiellement lisibles par l'humain. 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).

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.21 Entrées/sorties <stdio.h> (p : 217-247)
  • 7.29 Utilitaires de caractères larges et multioctets étendus <wchar.h> (p : 295-325)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.21 Entrée/sortie <stdio.h> (p: 296-339)
  • 7.29 Utilitaires de caractères larges et multioctets étendus <wchar.h> (p: 402-446)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.19 Entrées/sorties <stdio.h> (p : 262-305)
  • 7.24 Utilitaires de caractères larges et multioctets étendus <wchar.h> (p : 348-392)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.9 INPUT/OUTPUT <stdio.h>

Voir aussi

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)