Flots prédéfinis

Nous avons dit qu’il n’est pas possible d’écrire une assignation d’une instance de ostream vers une autre, et qu’il en est de même pour istream et iostream.

Les classes ostream_withassign, istream_withassign et iostream_withassign se distinguent de leur homologues en ce que l’opérateur d’affectation y est redéfini. On peut ainsi affecter un ostream à une instance de ostream_withassign, etc.

Voici par exemple comment est définie ostream_withassign :

class ostream_withassign : public ostream {     public:     ostream_withassign();     virtual ~ostream_withassign();     ostream_withassign& operator= (ostream&);     ostream_withassign& operator= (streambuf*);};

Le constructeur par défaut ne fait rien ; l’opérateur d’affectation avec un argument streambuf* est sensiblement identique au constructeur équivalent de ostream.

Si ces classes existent, c’est que c’est généralement une erreur de recopier un flot dans un autre : en particulier, si deux flots partagent le même fichier sur disque, des dégâts risquent de survenir. Le fait de déclarer un flot _withassign indique clairement que l’on souhaite faire une telle copie. Cela ne pose pas de problèmes avec les flots prédéfinis, qui sont au nombre de quatre :

ostream_withassign cout Comme on le sait déjà, ce flot envoie ses sorties à l’écran.
istream_withassign cin Ce flot prend ses entrées au clavier.
ostream_withassign cerr Flot d’erreur. Par défaut identique à cout.
ostream_withassign clog Flot d’erreur mais avec un tampon.

Il est parfaitement possible de modifier ces flots. Par exemple, pour envoyer les messages d’erreur vers un fichier error.msg, il suffit d’écrire :

ofstream ferr("ERROR.MSG");if (ferr)    // si on a pu ouvrir le fichier...     cerr = ferr;

Les classes _withassign occupent la même place mémoire que leurs homologues de base.

Précédent Précédent Sommaire Sommaire Suivant Suivant