Aller au contenu principal

Bibliothèque standard

Les flux de la bibliothèque standard​

Le fichier d'inclusion <stdio.h> contient la définition du type FILE. Ce type est une structure contenant les informations nécessaires à la bibliothèque pour la manipulation d'un fichier ouvert (descripteur sous-jacent, tampon, position, indicateurs d'erreur et de fin de fichier). Le contenu exact de cette structure peut varier d'un système à l'autre. Les fonctions d'entrées-sorties de la bibliothèque prennent en argument un pointeur sur une telle structure (FILE *), qui indique le flux sur lequel on doit effectuer l'opération d'écriture ou de lecture. Pour pouvoir utiliser une fonction d'entrée-sortie, il faut donc avoir une valeur pour cet argument : c'est le rôle de la fonction fopen de fournir ce pointeur en ouvrant le fichier. Les deux fonctions printf et scanf sont équivalentes à fprintf(stdout, format, ...) et fscanf(stdin, format, ...), où stdout et stdin sont des expressions de type FILE *. Le standard C impose que stdin, stdout et stderr soient des macros ; dans la glibc, elles désignent des variables globales du même nom.

Sur les systèmes de la famille UNIX, les fichiers ouverts par un processus le restent dans ses fils. Par exemple, le shell a en général trois flux standards, associés aux descripteurs 0, 1 et 2 :

  • stdin : le terminal ouvert en lecture
  • stdout : le terminal ouvert en écriture, mis en tampon par ligne lorsqu'il est associé à un terminal, et entièrement mis en tampon sinon (redirection vers un fichier ou un tube)
  • stderr : le terminal ouvert en écriture, non mis en tampon

Ainsi, si l'exécution d'un programme C est réalisée à partir du shell, le programme C dispose déjà de ces trois flux. Les données écrites dans un flux mis en tampon ne sont transmises au noyau (appel système write) qu'au remplissage du tampon, à la fin d'une ligne pour un flux mis en tampon par ligne, lors d'un appel explicite à fflush ou à la fermeture du flux (fclose, exit). Le mode de mise en tampon d'un flux peut être modifié avec setvbuf.