Hello,
Comment faire en sorte que ce qui est envoyé vers std::cout ne soit pas affiché ?
Version imprimable
Hello,
Comment faire en sorte que ce qui est envoyé vers std::cout ne soit pas affiché ?
> /dev/null ?
Il est possible de le faire en C++ !
Et plus rien ne s'affichera sur ce qui part dans std::cout.Code:std::cout.clear(std::ios::failbit);
Tu met la ligne ou tu utilise std::cout en commentaire.
Je n'ai pas accès à la ligne en question.
Les sorties écran sont générées par une bibliothèque externe.
lib statique ou dynamique? Est-ce que dans la lib ce sera le même std::cout que côté appelant ou pas? std::cout c'est une sorte de variable statique, non?
Dynamique. Je pense que c'est le std::cout standard.
as-tu essayé la solution proposée par jblecanard?
la raison pour laquelle je demandais pour le linkage est qu'à mes yeux std::cout ressemble fort à un objet statique, et je me demandais si dans ce cas pour une lib dynamique on n'aurait pas dans la lib sa propre instance std::cout qui serait insensible à ce qu'on fait à std::cout côté exécutable...
sinon effectivement rediriger stdout vers /dev/null devrait fonctionner sous *nix, je me demande s'il existe un équivalent windows?
Je savais bien qu'il devait exister quelque chose dans ce goût là.
Donc, avant d'appeler les fonctions de ma bibliothèque qui génèrent les sorties écran indésirables, j'appelle l'instruction que tu as données, et juste après, j'appelle :
pour rétablir le fonctionnement normal.Code:std::cout.clear(std::ios::goodbit);
C'est bien ça ?
Oui, c'est ça ! Ca présente un inconvénient tout de même : ce qui est envoyé dans std::out est évalué, par exemple, si tu désactives l'affichage, et que tu appelles :
f(3) sera évalué, bien que rien ne soit affiché. La question du linkage de la lib est pertinente. Il se peut que ça ne fonctionne pas à cause de ça... Une seule solution pour savoir : essayer.Code:std::cout << f(3);
Au delà du simple fait que ça ne fonctionne que sous Unix, ça ne donne aucune granularité à oodini qui veut bloquer les sorties d'une lib (et pas les siennes par exemple).
Même si le failbit doit marcher, il ne s'agit pas vraiment d'une redirection (les sorties vont échouer, plutôt que d'être redirigées) et ça ne me semble pas hyper robuste (et si le code en question fait du if (!cout), certes peu probable ?).
A mon avis, une solution à base de rdbuf est plus safe (et on peut même récupérer ce que l'application tierce a écrit, pour l'analyser par exemple). Voir un exemple sur http://www.cplusplus.com/reference/iostream/ios/rdbuf/ .
De toute façon, ma question est peut-être caduque, car on vient de m'apprendre que ladite bibliothèque est codée en C.
Je ne pense pas qu'intervenir sur les flux ait une quelconque influence.
Arf! Mais si elle est écrite en C, elle a des flux aussi, simplement ils ne sont pas gérés avec std::cout...
Quelqu'un qui connaît C saura peut-être si on peut écrire un code permettant de museler stdout de manière à ce que le code C ne puisse pas écrire dedans (mais sans que ça plante...)?
EDIT: peut être moyen d'utiliser +/- ça:
http://www.cplusplus.com/reference/c...stdio/freopen/
bon, c'est pas une solution finie, là, vu que le chemin pour revenir à l'état antérieur n'est pas tout tracé...