IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Rediriger le flux de sortie vers le néant


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Rediriger le flux de sortie vers le néant
    Hello,

    Comment faire en sorte que ce qui est envoyé vers std::cout ne soit pas affiché ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    > /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

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Il est possible de le faire en C++ !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout.clear(std::ios::failbit);
    Et plus rien ne s'affichera sur ce qui part dans std::cout.
    Find me on github

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    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

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je n'ai pas accès à la ligne en question.

    Les sorties écran sont générées par une bibliothèque externe.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Dynamique. Je pense que c'est le std::cout standard.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par therwald Voir le message
    as-tu essayé la solution proposée par jblecanard ?
    Non, j'avais raté sa réponse !

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Il est possible de le faire en C++ !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout.clear(std::ios::failbit);
    Et plus rien ne s'affichera sur ce qui part dans std::cout.
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout.clear(std::ios::goodbit);
    pour rétablir le fonctionnement normal.

    C'est bien ça ?

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    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.

    Citation Envoyé par pyros Voir le message
    > /dev/null ?
    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

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    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.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    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.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    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/

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    bon, c'est pas une solution finie, là, vu que le chemin pour revenir à l'état antérieur n'est pas tout tracé...

Discussions similaires

  1. Rediriger le flux de log vers JSF
    Par pilate dans le forum Logging
    Réponses: 5
    Dernier message: 07/02/2010, 17h17
  2. rediriger printf flux de sortie
    Par kaiser92 dans le forum Visual C++
    Réponses: 1
    Dernier message: 03/02/2010, 15h34
  3. [WinForms]Rediriger le flux de la console vers une listbox ou text box
    Par NicolasJolet dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 27/03/2007, 03h09
  4. [Eclipse 3.1][Plugin] Rediriger sortie vers la console
    Par petitpepito dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 18/01/2006, 23h37
  5. Comment rediriger la sortie vers /dev/null
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 24/06/2003, 18h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo