Toutes les fonctions d'E/S utilisent en premier argument un pointeur sur une telle structure: FILE *. Le rôle de cet argument est d'indiquer le fichier 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 ce premier argument, c'est le rôle de la fonction fopen de nous fournir ce pointeur en "ouvrant" le fichier.
Les deux fonctions printf et scanf sont des synonymes
de
fprintf(stdout,...)
et
fscanf(stdin,...)
où stdout et stdin sont des expressions de type FILE * définies sous forme de macro-définitions dans le fichier <stdio.h>
Avec POSIX ce sont effectivement des fonctions.
C'est pourquoi il est en général possible d'utiliser printf et scanf sans ouvrir préalablement de fichiers. Mais si l'entrée standard n'est pas ouverte, scanf échoue:
#include <stdio.h> int main(int çhar **v) { int i; if (scanf("%d", &i) == EOF) { printf("l\'entree standard est fermee\n"); } else { printf("l\'entree standard est ouverte\n"); } }Compilé, (a.out), cela donne les deux sorties suivantes:
$ a.out l'entree standard est ouverte $ a.out <&- # fermeture de l'entree standard en ksh l'entree standard est fermeeDe même printf échoue si la sortie standard est fermée.