1.8. Les fonctions d'entrée / sortie de baseNous avons distingué au début de ce chapitre les programmes graphiques, qui traitent les événements qu'ils reçoivent du système sous la forme de messages, des autres programmes, qui reçoivent les données à traiter et écrivent leurs résultats sur les flux d'entrée / sortie standards. Les notions de flux d'entrée / sortie standards n'ont pas été définies plus en détail à ce moment, et il est temps à présent de pallier cette lacune. 1.8.1. Généralités sur les flux d'entrée / sortie en CUn flux est une notion informatique qui permet de représenter un flot de données séquentielles en provenance d'une source de données ou à destination d'une autre partie du système. Les flux sont utilisés pour uniformiser la manière dont les programmes travaillent avec les données, et donc pour simplifier leur programmation. Les fichiers constituent un bon exemple de flux, mais ce n'est pas le seul type de flux existant : on peut traiter un flux de données provenant d'un réseau, d'un tampon mémoire ou de toute autre source de données ou partie du système permettant de traiter les données séquentiellement. Sur quasiment tous les systèmes d'exploitation, les programmes disposent dès leur lancement de trois flux d'entrée / sortie standards. Généralement, le flux d'entrée standard est associé au flux de données provenant d'un terminal, et le flux de sortie standard à la console de ce terminal. Ainsi, les données que l'utilisateur saisit au clavier peuvent être lues par les programmes sur leur flux d'entrée standard, et ils peuvent afficher leurs résultats à l'écran en écrivant simplement sur leur flux de sortie standard. Le troisième flux standard est le flux d'erreur standard qui, par défaut, est également associé à l'écran, et sur lequel le programme peut écrire tous les messages d'erreur qu'il désire.
Afin de permettre aux programmes d'écrire sur leurs flux d'entrée / sortie standards, la bibliothèque C définit plusieurs fonctions extrêmement utiles. Les deux principales fonctions sont sans doute les fonctions printf et scanf. La fonction printf (« print formatted » en anglais) permet d'afficher des données à l'écran, et scanf (« scan formatted ») permet de les lire à partir du clavier. En réalité, ces fonctions ne font rien d'autre que d'appeler deux autres fonctions permettant d'écrire et de lire des données sur un fichier : les fonctions fprintf et fscanf. Ces fonctions s'utilisent exactement de la même manière que les fonctions printf et scanf, à ceci près qu'elles prennent en premier paramètre une structure décrivant le fichier sur lequel elles travaillent. Pour les flux d'entrée / sortie standards, la bibliothèque C définit les pseudo-fichiers stdin, stdout et stderr, qui correspondent respectivement aux flux d'entrée, au flux de sortie et au flux d'erreur standards. Ainsi, tout appel à scanf se traduit par un appel à fscanf sur le pseudo-fichier stdin, et tout appel à printf par un appel à fprintf sur le pseudo-fichier stdout.
Les fonctions printf et scanf sont toutes deux des fonctions à nombre de paramètres variables. Elles peuvent donc être utilisées pour effectuer des écritures et des lectures multiples en un seul appel. Afin de leur permettre de déterminer la nature des données passées dans les arguments variables, elles attendent toutes les deux en premier paramètre une chaîne de caractères descriptive des arguments suivants. Cette chaîne est appelée chaîne de format, et elle permet de spécifier avec précision le type, la position et les options de format (précision, etc.) des données à traiter. Les deux sections suivantes décrivent la manière d'utiliser ces chaînes de format pour chacune des deux fonctions printf et scanf. 1.8.2. La fonction printfLa fonction printf s'emploie comme suit : printf(chaîne de format [, valeur [, valeur [...]]]) On peut passer autant de valeurs que l'on veut, pour peu qu'elles soient toutes référencées dans la chaîne de format. Elle renvoie le nombre de caractères affichés. La chaîne de format peut contenir du texte, mais surtout elle doit contenir autant de formateurs que de variables à afficher. Si ce n'est pas le cas, le programme plantera. Les formateurs sont placés dans le texte là où les valeurs des variables doivent être affichées. La syntaxe des formateurs est la suivante : %[[indicateur]...][largeur][.précision][taille] type Un formateur commence donc toujours par le caractère %. Pour afficher ce caractère sans faire un formateur, il faut le dédoubler (%%). Le type de la variable à afficher est obligatoire lui aussi. Les types utilisables sont les suivants : Tableau 1-1. Types pour les chaînes de format de printf
Les autres paramètres sont facultatifs. Les valeurs disponibles pour le paramètre de taille sont les caractères suivants : Tableau 1-2. Options pour les types des chaînes de format
Exemple 1-22. Utilisation de printf et fprintf #include <stdio.h> /* Ne pas chercher à comprendre cette ligne
pour l'instant. Elle est nécessaire pour utiliser
les fonctions printf et scanf. */
int main(void)
{
int i = 2;
printf("Voici la valeur de i : %d.\n", i);
/* Exemple d'écriture sur la sortie d'erreur standard : */
fprintf(stderr, "Pas d'erreur jusqu'ici...\n");
return 0;
}Vous remarquerez dans cet exemple la présence d'une ligne #include <stdio.h>. Cette ligne est nécessaire pour permettre l'utilisation des fonctions printf et fprintf. Nous décrirons sa signification précise ultérieurement dans le chapitre sur le préprocesseur. Sans entrer dans les détails, disons simplement que cette ligne permet d'inclure un fichier contenant les déclarations de toutes les fonctions d'entrée / sortie de base. Les paramètres indicateurs, largeur et précision sont moins utilisés. Il peut y avoir plusieurs paramètres indicateurs, ils permettent de modifier l'apparence de la sortie. Les principales options sont :
Le paramètre largeur permet de spécifier la largeur minimale du champ de sortie, si la sortie est trop petite, on complète avec des 0 ou des espaces. Notez qu'il s'agit bien d'une largeur minimale ici et non d'une largeur maximale. Le résultat du formatage de la donnée à écrire peut donc dépasser la valeur indiquée pour la largeur du champ. Enfin, le paramètre précision spécifie la précision maximale de la sortie (nombre de chiffres à afficher). 1.8.3. La fonction scanfLa fonction scanf permet de faire une ou plusieurs entrées. Comme la fonction printf, elle attend une chaîne de format en premier paramètre. Il faut ensuite passer les variables devant contenir les entrées dans les paramètres qui suivent. Sa syntaxe est la suivante : scanf(chaîne de format, &variable [, &variable [...]]); Elle renvoie le nombre de variables lues. Ne cherchez pas à comprendre pour l'instant la signification du symbole & se trouvant devant chacune des variables. Sachez seulement que s'il est oublié, le programme plantera. La chaîne de format peut contenir des chaînes de caractères. Toutefois, si elle contient autre chose que des formateurs, le texte saisi par l'utilisateur devra correspondre impérativement avec les chaînes de caractères indiquées dans la chaîne de format. scanf cherchera à reconnaître ces chaînes, et arrêtera l'analyse à la première erreur. La syntaxe des formateurs pour scanf diffère un peu de celle de ceux de printf : %[*][largeur][taille]type Seul le paramètre largeur change par rapport à printf. Il permet de spécifier le nombre maximal de caractères à prendre en compte lors de l'analyse du paramètre. Le paramètre '*' est facultatif, il indique seulement de passer la donnée entrée et de ne pas la stocker dans la variable destination. Cette variable doit quand même être présente dans la liste des paramètres de scanf.
|
Michel RIVEILL |