8.12. Des entrées - sorties simplifiées
Les flux d'entrée / sortie de la bibliothèque standard C++ constituent sans doute
l'une des applications les plus intéressantes de la surcharge des opérateurs. Comme nous allons
le voir, la surcharge des opérateurs << et >>
permet d'écrire et de lire sur ces flux de manière très intuitive.
En effet, la bibliothèque standard C++ définit dans l'en-tête
iostream des classes extrêmement puissantes permettant
de manipuler les flux d'entrée / sortie. Ces classes réalisent en particulier les opérations
d'entrée / sortie de et vers les périphériques d'entrée et les périphériques de sortie standards
(généralement, le clavier et l'écran), mais elles ne s'arrêtent pas là : elles permettent
également de travailler sur des fichiers ou encore sur des tampons en mémoire.
Les classes d'entrée / sortie de la bibliothèque standard C++ permettent donc
d'effectuer les mêmes opérations que les fonctions printf et
scanf de la bibliothèque C standard. Cependant, grâce au mécanisme de surcharge
des opérateurs, elles sont beaucoup plus faciles d'utilisation. En effet, les opérateurs
<< et >> de ces classes ont été
surchargés pour chaque type de donnée du langage, permettant ainsi de réaliser des entrées / sorties
typées extrêmement facilement. L'opérateur <<, également appelée opérateur
d'insertion, sera utilisé pour réaliser des écritures sur un flux de données, tandis que l'opérateur
>>, ou opérateur d'extraction, permettra de réaliser la lecture d'une nouvelle
donnée dans le flux d'entrée. Ces deux opérateurs renvoient tous les deux le flux de données utilisé,
ce qui permet de réaliser plusieurs opérations d'entrée / sortie successivement sur le même flux.
Note : Cette section n'a pas pour but de décrire en détail les flux
d'entrée / sortie de la bibliothèque standard C++, mais plutôt d'en faire une présentation simple
permettant de les utiliser sans avoir à se plonger prématurément dans des notions extrêmement
évoluées. Vous trouverez une description exhaustive des mécanismes des flux d'entrée / sortie
de la bibliothèque standard C++ dans le Chapitre 15.
La bibliothèque standard définit quatre instances particulières de ses classes
d'entrée / sortie : cin, cout, cerr et
clog. Ces objets sont des instances des classes istream et
ostream, prenant respectivement en charge l'entrée et la sortie des données
des programmes. L'objet cin correspond au flux d'entrée standard
stdin du programme, et l'objet cout aux flux de sortie standard
stdout. Enfin, les objets cerr et clog sont
associés au flux d'erreurs standard stderr. Théoriquement, cerr
doit être utilisé pour l'écriture des messages d'erreur des programmes, et clog
pour les messages d'information. Cependant, en pratique, les données écrites sur ces deux flux sont
écrites dans le même flux, et l'emploi de l'objet clog est assez rare.
L'utilisation des opérateurs d'insertion et d'extraction sur ces flux se résume
donc à la syntaxe suivante :
cin >> variable [>> variable [...]];
cout << valeur [<< valeur [...]];
Comme on le voit, il est possible d'effectuer plusieurs entrées ou plusieurs sortie successivement
sur un même flux.
De plus, la bibliothèque standard définie ce que l'on appelle
des manipulateurs permettant de réaliser des opérations simples sur les flux
d'entrée / sortie. Le manipulateur le plus utilisé est sans nul doute le manipulateur
endl qui, comme son nom l'indique, permet de signaler une fin de ligne et d'effectuer
un saut de ligne lorsqu'il est employé sur un flux de sortie.
Exemple 8-24. Flux d'entrée / sortie cin et cout
#include <iostream>
using namespace std;
int main(void)
{
int i;
// Lit un entier :
cin >> i;
// Affiche cet entier et le suivant :
cout << i << " " << i+1 << endl;
return 0;
}Note : Comme on le verra dans le Chapitre 15, les manipulateurs
sont en réalité des fonctions pour le type desquelles un opérateur << ou
un opérateur >> a été défini dans les classes d'entrée / sortie. Ces opérateurs
appellent ces fonctions, qui effectuent chacune des modifications spécifiques sur le flux sur lequel
elles travaillent.
Les flux d'entrée / sortie cin, cout
cerr et clog sont déclarés dans l'espace de nommage
std:: de la bibliothèque standard C++. On devra donc faire précéder leur nom du préfixe
std:: pour y accéder, ou utiliser un directive using
pour importer les symboles de la bibliothèque standard C++ dans l'espace de nommage global. Vous trouverez
de plus amples renseignements sur les espaces de nommages dans le Chapitre 11.
Les avantages des flux C++ sont nombreux, on notera en particulier ceux-ci :
le type des donnée est automatiquement pris en compte par
les opérateurs d'insertion et d'extraction (ils sont surchargés pour tous les types prédéfinis) ;
les opérateurs d'extraction travaillent par référence
(on ne risque plus d'omettre l'opérateur & dans la fonction scanf) ;
il est possible de définir des opérateurs d'insertion et
d'extraction pour d'autres types de données que les types de base du langage ;
leur utilisation est globalement plus simple.
Les flux d'entrée / sortie définis par la bibliothèque C++ sont donc d'une extrême
souplesse et sont extensibles aux types de données utilisateur. Par ailleurs, ils disposent d'un grand
nombre de paramètres de formatage et d'options avancées. Toutes ces fonctionnalités seront décrites
dans le Chapitre 15, où nous verrons également comment réaliser des entrées / sorties
dans des fichiers.