J'aimerais envoyer des données à nulle part, je veux dire que je ne veux pas imprimer de données dans la console ni dans le fichier, mais j'ai besoin de certains std :: Ostream code> objet. Comment faire ça? P>
5 Réponses :
J'ai utilisé: récemment sans problèmes, bien qu'il ait été signalé comme ayant des problèmes potentiels si vous l'avez examiné d'un certain angle (voir le lien ci-dessous). p> Cela empêche le flux de sortir de plus d'informations, mais simplement le jeter. P>
blockQuote> Le programme suivant le montre en action: p> La page où je l'ai eue de a également eu ceci comme solution probablement plus propre (légèrement modifiée pour supprimer la duplication de ma première solution ci-dessus): P> < Pré> xxx pré> p>
basic_ios :: init (init) 0) code> et, car c'est un pointeur NULL étant transmis, il définit l'état du flux, comme retourné par la fonction
rdstate () code>, à la valeur code> Badbit code> . p>
Qu'est-ce que cela signifie que vous donnez 0 dans le constructeur?
Celui-ci (apparemment, puisque je ne suis pas entièrement i> certain du fonctionnement interne) définit l'état du flux sur mauvais (en appelant init code> avec un pointeur null), je crois qu'il a gagné Il tente ensuite d'envoyer plus de données, mais simplement de le jeter. Prenez cela avec un gros grain de sel i>
Quelques suggestions ici http://bytes.com/topic/c / Réponses / 589209-STD-NULL-STREAM
Une bonne réponse de ce site P>
Utilisez STD ordinaire :: FRStream, Ouvrez uniquement pour écrire au fichier requis "/ dev / null". Il devrait fonctionner. P>
Si vous voulez vraiment créer votre propre flux, tirez simplement de basic_ostream et définissez simplement votre propre opérateur
En fait, P>
#include <streambuf> #include <ostream> template <class cT, class traits = std::char_traits<cT> > class basic_nullbuf: public std::basic_streambuf<cT, traits> { typename traits::int_type overflow(typename traits::int_type c) { return traits::not_eof(c); // indicate success } }; template <class cT, class traits = std::char_traits<cT> > class basic_onullstream: public std::basic_ostream<cT, traits> { public: basic_onullstream(): std::basic_ios<cT, traits>(&m_sbuf), std::basic_ostream<cT, traits>(&m_sbuf) { init(&m_sbuf); } private: basic_nullbuf<cT, traits> m_sbuf; }; typedef basic_onullstream<char> onullstream; typedef basic_onullstream<wchar_t> wonullstream;
La solution la plus simple est juste pour produire à un Sinon, il est assez simple d'implémenter un courant nul; le seul
(le tampon évitera des appels de fonction virtuelle inutiles. Sur certains
plates-formes, cela fait une différence significative.) p> puis créez un flux de sortie qui l'utilise: p> (l'utilisation de l'héritage, plutôt que de la confinement, assure que le
StreamBuf est entièrement construit avant d'être transmis au std :: destream code>
(ou tout autre flux de sortie dans un état d'erreur). Cela entraînera la
ruisseau étant en permanence dans un état d'erreur. Cela pourrait être un avantage
(
<<< / code> Les opérateurs ignoreront le formatage), mais si un code que vous avez
ne peut pas contrôler les chèques des erreurs et fait quelque chose de particulier s'il
se produire, vous aurez probablement des problèmes.
Streambuf CODE> La fonction que vous devez vraiment remplacer est
Overflow code>.
Quelque chose comme ce qui suit devrait faire le truc: p>
ostream code>.
Ce n'est généralement pas nécessaire dans la pratique, mais la norme ne fonctionne pas
semblent autoriser la transmission d'un
streambuf code> non construit non encore construit à la
constructeur de
ostream code>.) p> p>
solution la plus simple: utilisez un std :: stringstream code>.
stringstream code> contiendra la sortie, mais si vous ne " t Utilisez-le, c'est la même chose que s'il n'a jamais été rempli. P> p>
Sauf que le StringStream allouera toujours la mémoire, ce qui peut être un problème, si la sortie est grande.
Puisque personne ne l'a mentionné, s'il s'agit de supprimer STD ou de la sortie d'erreur, vous pouvez simplement fermer les descripteurs de fichiers correspondants (par exemple, FCLose (stdout) code> ou
FCLOSE (STDERR) CODE> ).
Cela shup up tout, y compris des choses comme printf code> ou
fprintf (stardr, ...) code>
Donc, vous continuerez à continuer à utiliser le habituel code> ou
cerr code>, mais ils seront transformés en godets de bits. P>
Je suis à peu près sûr que c'est une dupe, je ne peux pas rechercher votre guichet automatique, car je suis sur mon iPhone.