Flux d'Entrées/Sorties standard

 

Entrées/sorties

Quand vous programmez, vous avez souvent besoin d’échanger des informations avec l’utilisateur, de consulter ou d’enregistrer des données. La gestion des entrées/sorties est donc particulièrement importante. En programmation traditionnelle, il n’existait pas de bonnes fonctions d’entrées/sorties générales. La plupart des utilitaires disponibles n’étaient conçus que pour traiter une partie des types de données intégrés du langage. Comme un programme C++ évolué utilise un grand nombre de types définis par l’utilisateur (les classes), celui-ci doit aussi être en mesure d’étendre la fonctionnalité des entrées/sorties standard pour prendre en charge les besoins de son application.

En C++, le détail des opérations d’écriture sur l’écran ou dans un fichier, ou celui de la lecture à partir du clavier ou dans un fichier sont encapsulés dans les flux. Les flux prennent en charge le transport puis l’affichage ou l’écriture des données sur le disque ou l’écran de l’ordinateur. En isolant la gestion des entrées/sorties dans des bibliothèques, on améliore la portabilité du langage. Si vous écrivez votre programme sur un PC, il suffira de le recompiler avec les bibliothèques appropriées pour l’exécuter sur un Mac ou une machine Sun.

Comme on pouvait s’y attendre, le C++ implémente la fonctionnalité des entrées/sorties en accord avec l’orienté objet.  

Flux d’E/S standard

Quand vous incluez la bibliothèque iostream au début du fichier source, quatre objets sont créés et initialisés au lancement du programme :
  • cin. Gère les entrées en provenance de l’entrée standard, le clavier. >> (lire depuis) est l’opérateur de réception associé.
  • cout. Gère les sorties vers la sortie standard, l’écran. << (écrire dans) est l’opérateur d’émission associé.
  • cerr. Gère les sorties vers l’unité d’erreur standard, l’écran.
  • clog. Gère les messages d’erreur transmis vers la sortie erreur standard, l’écran.
 

Redirection

La redirection est une fonction du système d’exploitation plus qu’une fonction des bibliothèques iostream. Le C++ offre l’accès aux quatre unités standard, et l’utilisateur peut les rediriger selon ses besoins. DOS et Unix utilisent les mêmes opérateurs de redirection : < (pour rediriger les entrées) et > (pour rediriger les sorties). Les commandes de redirection d’Unix sont plus évoluées que les commandes DOS rudimentaires mais le principe est le même : écrire dans un fichier les données initialement envoyées à l’écran ou lire des données dans un fichier plutôt qu’à partir du clavier, par exemple.

Cette redirection s’obtient avec le caractère pipe | qui permet de chaîner les commandes de sorte que la sortie de l’une devienne l’entrée de l’autre.  

Utilisation de base des flux d’E/S standard

Le petit programme que nous présentons maintenant utilise les flux d’entrée et de sortie du C++ pour proposer une conversion euros vers francs ou francs vers euros.  

À savoir

Pour simplifier le code des programmes présentés dans cet ouvrage, nous avons laissé les caractères accentués dans les chaînes de caractères traitées. Pour obtenir un affichage correct à l’exécution, une solution consiste à remplacer ces caractères par x suivi de leur valeur en hexadécimal. Cette solution a été mise en œuvre dans les fichiers source des exemples disponibles sur le site www.dunod.com.

Tableau 2.2 : principaux codes hexadécimaux

Caractère accentué Codage dans le programme
Ü x81
éx82
âx83
äx84
àx85
çx87
êx88
ëx89
èx8A
ï x8B
î x8C


Le nombre de chiffres hexadécimaux dans la séquence n’étant pas fixe, il y a un risque pour que le caractère suivant dans la chaîne soit interprété comme s’il faisait partie du code hexadécimal. Le mieux est de « couper » la chaîne à ce niveau comme dans l’exemple suivant :

cout << "Saisissez la valeur à convertir:n"   

devient :
cout << "Saisissez la valeur x85" << " convertir : n" ;

 

Code 2.2 : convertisseur francs/eurosxe "convertisseur francs/euros"

1 : #include<iostream>     
2 : using namespace std; //std = espace de noms par défaut     
3 :     
4 : int main()     
5 : {     
6 :    const double indice = 6.55957; //valeur en francs d’un euro     
7 :    float prix, euros, francs;     
8 :    char monnaie = 0;     
9 :     
10:    cout << "Saisissez la valeur à convertir suivie de sa monnaie:n";     
11:     
12:    cin >> prix;     //on lit la valeur saisie au clavier     
13:    cin  >> monnaie;   //on lit l’initiale de la monnaie     
14:     
15:    switch (monnaie){  //Selon la monnaie     
16:    case ‘f’:          //on convertit en euros     
17:      francs = prix;     
18:      euros = prix / indice;     
19:      break;     
20:    case ‘e’:          //ou on convertit en francs     
21:      francs = prix * indice;     
22:      euros = prix;     
23:      break;     
24:    default:     
25:      euros = francs = 0;     
26:      break;     
27:    }     
28:    //on affiche le résultat     
29:    cout << francs << " francs = ";     
30:    cout << euros << " eurosn";     
31: }    


Le concept de constante définie par l’utilisateur (désignée par constxe "mot clé:const"xe "const (mot clé)"xe "constante définie par l’utilisateur (const)") est spécifique au C++. À la ligne 6, nous définissons la constante symbolique indice représentant la valeur d’un euro en francs. Le mot clé const indique que cette valeur ne doit pas être modifiée dans les limites de sa portée (pour la définition de la portée d’une variable, consultez l’ouvrage Codes en Stock C aux éditions CampusPress). L’utilisation des constantes symboliques présente plusieurs avantages. Si une constante numérique comme un millésime ou un taux est codée à de nombreuses reprises dans un programme, celui-ci sera plus difficile à mettre à jour si la valeur doit être modifiée. Avec une constante symbolique, vous ne changez qu’une seule ligne de code. De plus, lorsque vous lisez le programme, pi ou millesime sera plus parlant que 3.14 ou 2000. Les constantes symboliques sont utilisées le plus souvent pour les limites de tableau ou les instructions case.  

À savoir

Si vous ajoutez le mot clé const à la déclaration d’un objet pour le définir comme constant, n’oubliez pas de l’initialiser puisque aucune valeur ne pourra ensuite lui être attribuée !
const int millesime = 2001   // millesime est une constante de valeur 2001;       
const int pi;   // erreur, pi n’a pas été initialisée   


Poursuivons avec la ligne 10 dans laquelle nous confions le message destiné à l’utilisateur au flux de sortie standard cout. Celui-ci se charge d’acheminer les données et de les afficher à l’écran. La sortie de tous les types de données intégrés est définie dans l’en-tête <ostream>xe "ostream (bibliothèque)"xe "bibliothèque standard:ostream". Cet en-tête contient la partie de <iostream> liée à la sortie. Par défaut, les valeurs envoyées vers la sortie cout sont converties en séquences de caractères.

Les deux instructions des lignes 12 et 13 permettent de lire respectivement la valeur à convertir et la monnaie. En effet, le flux d’entrée cin considère les espaces comme des caractères de séparation. Dès que ce flux rencontre un blanc, une tabulation ou un retour à la ligne, il considère que le paramètre en cours de lecture est terminé. Vous pouvez « chaîner » les entrées dans le flux cin exactement comme nous l’avons fait à la ligne 29 pour le flux cout. Vous pouvez donc remplacer les lignes 12 et 13 par :

cin >> prix >> monnaie;


La représentation chaîne de caractères de tous les types de données intégrés est définie dans l’en-tête <istream>xe "istream (bibliothèque)"xe "bibliothèque standard:istream". Cet en-tête contient la partie de <iostream> liée à l’entrée. Nous verrons par la suite que les flux de istream et de ostream peuvent facilement être développés pour prendre en compte les types définis par l’utilisateur.

À la ligne 15, l’instruction switchxe "switch (mot clé)"xe "mot clé:switch" teste une valeur par rapport à un ensemble de constantes. Dans notre exemple, elle compare l’initiale de la monnaie à « f » pour les francs et à « e » pour les euros. Les instructions break permettent de sortir du bloc switch. Si la valeur testée ne correspond à aucune des constantes, c’est l’instruction default facultative qui est exécutée.

Le texte original de cette fiche pratique est extrait de
«Tout sur le C++» (Christine EBERHARDT, Collection
CommentCaMarche.net, Dunod, 2009)

Réalisé sous la direction de , fondateur de CommentCaMarche.net.

Ce document intitulé «  Flux d'Entrées/Sorties standard  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.