OVH Cloud OVH Cloud

ostream et affectation

5 réponses
Avatar
Garobat
Bonjour,
Je suis tombé sur un code qui compilait avec vc6 et qui pour enregistrer
des information dans des fichiers en redirigeant cout par une
affectation avant de l'utiliser
( genre cout = fichier1; cout <<.....; cout = fichier2; etc.)
Ceci ne compile plus avec vc7 (la STL ne supporte apperemetn pas les
cout = xx) et je n'est pas une franche envie de reprendre tout le vieux
code et remplacer les cout par .. autre chose mais dont la syntaxe
serait pareil et qui accepterait les affectations....
Comment je pourrais remplacer l'opérateur = de la classe ostream (qui
n'existe plus dans la STL)? Et si il n'y a vraiment pas moyen quelqu'un
aurait une autre sivouplé?

Merci d'avance....

5 réponses

Avatar
drkm
Garobat writes:

quelqu'un aurait une autre sivouplé?


Je dirais qu'il te faut définir ton propre flux pour encapsuler un
flux standard. Mais je laisse James et Samuel te donner tous les
détails.

--drkm

Avatar
Loïc Joly
Garobat wrote:
Bonjour,
Je suis tombé sur un code qui compilait avec vc6 et qui pour enregistrer
des information dans des fichiers en redirigeant cout par une
affectation avant de l'utiliser
( genre cout = fichier1; cout <<.....; cout = fichier2; etc.)
Ceci ne compile plus avec vc7 (la STL ne supporte apperemetn pas les
cout = xx) et je n'est pas une franche envie de reprendre tout le vieux
code et remplacer les cout par .. autre chose mais dont la syntaxe
serait pareil et qui accepterait les affectations....
Comment je pourrais remplacer l'opérateur = de la classe ostream (qui
n'existe plus dans la STL)? Et si il n'y a vraiment pas moyen quelqu'un
aurait une autre sivouplé?

Merci d'avance....

Regarde du côté de rdbuf. De mémoire, ça ressemble à :


std::ostreambuf save = cout.rdbuf(fichier1.rdbuf());
cout << ...

cout.rdbuf(save);


--
Loïc

Avatar
kanze
Garobat wrote in message
news:<3f676cf1$0$20947$...

Je suis tombé sur un code qui compilait avec vc6 et qui pour
enregistrer des information dans des fichiers en redirigeant cout par
une affectation avant de l'utiliser

( genre cout = fichier1; cout <<.....; cout = fichier2; etc.)

Ceci ne compile plus avec vc7 (la STL ne supporte apperemetn pas les
cout = xx)


Et avait un comportement indéfini avec VC6. L'affectation des flux n'a
jamais fait partie de la spécification de la bibliothèque. Il s'avère
qu'il marchait à cause de la façon que l'implémentation s'attaquait au
problème de l'initialisation des flux standard.

À cet égard, Microsoft n'a fait que copier la bibliothèque USL. (Il
n'en était pas le seul.)

et je n'est pas une franche envie de reprendre tout le vieux code et
remplacer les cout par .. autre chose mais dont la syntaxe serait
pareil et qui accepterait les affectations....


Surtout que cette autre chose n'existe pas. L'affectation d'un flux n'a
pas de sens, et n'a jamais été supporté. Il s'avère qu'il marchait, plus
ou moins, et avec une sémantique mal définie, sur pas mal
d'implémentations ; la norme a exigé en revanche qu'elle génère une
erreur (parce que personne ne savait ce que devait être réelement la
sémantique).

AMHA, la seule solution viable, c'est de remplacer les cout par une
référence passée en paramètre à la fonction, et ensuite de passer le bon
paramètre.

Sinon, comme solution temporaire, la norme a prévu des fonctions pour
changer le streambuf associé à un flux. Tu peux donc changer aussi le
streambuf associé à cout, à condition de le restorer ensuite. Mais ça ne
marche qu'avec les bibliothèques modernes -- ce n'est pas portable.

Comment je pourrais remplacer l'opérateur = de la classe ostream (qui
n'existe plus dans la STL)? Et si il n'y a vraiment pas moyen
quelqu'un aurait une autre sivouplé?


Une autre quoi ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
kanze
drkm wrote in message
news:...
Garobat writes:

quelqu'un aurait une autre sivouplé?


Je dirais qu'il te faut définir ton propre flux pour encapsuler un
flux standard.


Je ne crois pas que ça puisse résoudre son problème. À la base, son
problème, c'est qu'il y a eu un programmeur idiot qui a sorti des
données à std::cout ; quelque chose comme :
std::cout << ...
va bien dans les programmes de démo, ou des exercises de l'école, mais
n'apparaît jamais dans un programme professionnel. Par la suite,
l'inévitable s'est produit, et il a fallu sortir vers d'autres choses.
Alors, plutôt que corriger la première erreur, on s'est rébattu sur un
comportement non documenté et non garantis des flux dont ils se
servaient à l'époque. (D'un certain côté, c'est aussi idiot que la
première erreur. Mais qui, sous la pression d'un termine, n'a jamais
pris des raccourcis.)

Maintenant, le bricolage a cassé, et il faut réparer les dégâts. On peut
encore contourner le problème, au moyen d'un rdbuf avec paramètre, mais
c'est encore un bricolage en plus. Où on peut prendre le temps qu'il
faut pour corriger le vrai problème, qu'on sort vers cout. Si on reste
uniquement avec VC++, le nouveau pansement pourrait tenir un certain
temps ; si du coup il faut porter à un compilateur avec une bibliothèque
plus ancien...

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
kanze
Samuel Krempp wrote in message
news:<3f68170d$0$20162$...
le Wednesday 17 September 2003 09:35, écrivit :

Sinon, comme solution temporaire, la norme a prévu des fonctions
pour changer le streambuf associé à un flux. Tu peux donc changer
aussi le streambuf associé à cout, à condition de le restorer
ensuite. Mais ça ne marche qu'avec les bibliothèques modernes -- ce
n'est pas portable.


pas portable à cause des implémentations moins récentes, mais garanti
par la norme.

ou alors ce n'est pas garanti parecque cout n'est pas n'importe quel
stream ?


Pas portable parce que ça ne marche pas avec les compilateurs dont je
suis obligé à m'en servir:-). Autant que je sache, c'est garanti par la
norme, au moins si tu restaures le streambuf initial avant que le
destructeur soit appelé.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16