Hello,
Comment faire en sorte que ce qui est envoyé vers std::cout ne soit pas affiché ?
Hello,
Comment faire en sorte que ce qui est envoyé vers std::cout ne soit pas affiché ?
> /dev/null ?
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry
Il est possible de le faire en C++ !
Et plus rien ne s'affichera sur ce qui part dans std::cout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::cout.clear(std::ios::failbit);
Find me on github
Tu met la ligne ou tu utilise std::cout en commentaire.
"L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
----------------------
T.O.A.O 6-MarViN
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part 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).
Find me on github
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/ .
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
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é...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager