Programmer en langage C
192
© Éditions Eyrolles
6 Les fichiers prédéfinis
Un certain nombre de fichiers sont connus du langage C, sans qu’il soit nécessaire ni de les
ouvrir ni de les fermer :
●
stdin : unité d’entrée (par défaut, le clavier) ;
●
stdout : unité de sortie (par défaut, l’écran) ;
●
stderr : unité d’affichage des messages d’erreurs (par défaut, l’écran).
On trouve parfois également :
●
stdaux : unité auxiliaire ;
●
stdprt : imprimante
Les deux premiers fichiers correspondent aux unités standard d’entrée et de sortie d’un programme. Lorsque vous exécutez un programme depuis le système, vous pouvez éventuellement
rediriger ces fichiers. Par exemple, la commande système suivante (valable à la fois sous UNIX
et sous DOS) :
TRUC
>RESULTATS
exécute le programme TRUC, en utilisant comme unité d’entrée le fichier DONNEES et comme
unité de sortie le fichier RESULTATS.
Dans ces conditions, une instruction telle que, par exemple, fgetchar deviendrait équivalente à fgetc(fich) où fich serait un flux obtenu par appel à fopen. De même,
scanf(...) deviendrait équivalent à fscanf(fich, ..), etc.
Notez bien qu’au sein du programme même il n’est pas possible de savoir si un fichier prédéfini a été redirigé au moment du lancement du programme ; autrement dit, lorsqu’une fonction
comme fgetchar ou scanf lit des informations, elle ne peut absolument pas savoir si ces
dernières proviennent du clavier ou d’un fichier.
pour lire en toute tranquillité sur stdin. Dans la section 2.3 du chapitre consacré aux chaînes de caractères, nous vous avons montré comment régler les problèmes posés par scanf,
en faisant appel à l’association des deux fonctions gets et sscanf. Pour ce faire, nous avions
dû toutefois supposer que les lignes lues par gets ne dépasseraient pas une certaine longueur.
Cette hypothèse est déjà restrictive dans le cas d’informations provenant du clavier : même si
cela peut paraître naturel à la plupart des utilisateurs de ne pas dépasser, par exemple, une
largeur d’écran, le risque existe d’en voir certains entrer une ligne trop longue qui « plantera »
le programme. Cette même hypothèse devient franchement intolérable dans le cas de lecture
dans un fichier (sur lequel peut avoir été redirigée l’entrée standard !).
En fait, il est très simple de régler définitivement ce problème. Il suffit d’employer (revoyez
l’exemple de la section 2.3 du chapitre consacré aux chaînes), à la place de :
gets (ligne) ;
une instruction telle que (LG désignant le nombre maximal de caractères acceptés) :
fgets (ligne, LG, stdin)
Delannoy Livre.book Page 192 Mercredi, 6. mai 2009 4:26 16
192
© Éditions Eyrolles
6 Les fichiers prédéfinis
Un certain nombre de fichiers sont connus du langage C, sans qu’il soit nécessaire ni de les
ouvrir ni de les fermer :
●
stdin : unité d’entrée (par défaut, le clavier) ;
●
stdout : unité de sortie (par défaut, l’écran) ;
●
stderr : unité d’affichage des messages d’erreurs (par défaut, l’écran).
On trouve parfois également :
●
stdaux : unité auxiliaire ;
●
stdprt : imprimante
Les deux premiers fichiers correspondent aux unités standard d’entrée et de sortie d’un programme. Lorsque vous exécutez un programme depuis le système, vous pouvez éventuellement
rediriger ces fichiers. Par exemple, la commande système suivante (valable à la fois sous UNIX
et sous DOS) :
TRUC
exécute le programme TRUC, en utilisant comme unité d’entrée le fichier DONNEES et comme
unité de sortie le fichier RESULTATS.
Dans ces conditions, une instruction telle que, par exemple, fgetchar deviendrait équivalente à fgetc(fich) où fich serait un flux obtenu par appel à fopen. De même,
scanf(...) deviendrait équivalent à fscanf(fich, ..), etc.
Notez bien qu’au sein du programme même il n’est pas possible de savoir si un fichier prédéfini a été redirigé au moment du lancement du programme ; autrement dit, lorsqu’une fonction
comme fgetchar ou scanf lit des informations, elle ne peut absolument pas savoir si ces
dernières proviennent du clavier ou d’un fichier.
pour lire en toute tranquillité sur stdin. Dans la section 2.3 du chapitre consacré aux chaînes de caractères, nous vous avons montré comment régler les problèmes posés par scanf,
en faisant appel à l’association des deux fonctions gets et sscanf. Pour ce faire, nous avions
dû toutefois supposer que les lignes lues par gets ne dépasseraient pas une certaine longueur.
Cette hypothèse est déjà restrictive dans le cas d’informations provenant du clavier : même si
cela peut paraître naturel à la plupart des utilisateurs de ne pas dépasser, par exemple, une
largeur d’écran, le risque existe d’en voir certains entrer une ligne trop longue qui « plantera »
le programme. Cette même hypothèse devient franchement intolérable dans le cas de lecture
dans un fichier (sur lequel peut avoir été redirigée l’entrée standard !).
En fait, il est très simple de régler définitivement ce problème. Il suffit d’employer (revoyez
l’exemple de la section 2.3 du chapitre consacré aux chaînes), à la place de :
gets (ligne) ;
une instruction telle que (LG désignant le nombre maximal de caractères acceptés) :
fgets (ligne, LG, stdin)
Delannoy Livre.book Page 192 Mercredi, 6. mai 2009 4:26 16
