11
votes

Impression à Nulle part avec Onetream

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 objet. Comment faire ça?


1 commentaires

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.


5 Réponses :


14
votes

J'ai utilisé: xxx

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).

Misté: de ce que je comprends (et je ne suis pas entièrement sûr de cela), que l'appel ci-dessus finit par appeler basic_ios :: init (init) 0) et, car c'est un pointeur NULL étant transmis, il définit l'état du flux, comme retourné par la fonction rdstate () , à la valeur Badbit .

Cela empêche le flux de sortir de plus d'informations, mais simplement le jeter.

Le programme suivant le montre en action: xxx

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): < Pré> xxx


2 commentaires

Qu'est-ce que cela signifie que vous donnez 0 dans le constructeur?


Celui-ci (apparemment, puisque je ne suis pas entièrement certain du fonctionnement interne) définit l'état du flux sur mauvais (en appelant init 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



0
votes

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;


0 commentaires

5
votes

La solution la plus simple est juste pour produire à un std :: destream (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.

Sinon, il est assez simple d'implémenter un courant nul; le seul Streambuf La fonction que vous devez vraiment remplacer est Overflow . Quelque chose comme ce qui suit devrait faire le truc: xxx

(le tampon évitera des appels de fonction virtuelle inutiles. Sur certains plates-formes, cela fait une différence significative.)

puis créez un flux de sortie qui l'utilise: xxx

(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 ostream . 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 non construit non encore construit à la constructeur de ostream .)


0 commentaires

2
votes

solution la plus simple: utilisez un std :: stringstream . xxx

stringstream contiendra la sortie, mais si vous ne " t Utilisez-le, c'est la même chose que s'il n'a jamais été rempli.


1 commentaires

Sauf que le StringStream allouera toujours la mémoire, ce qui peut être un problème, si la sortie est grande.



0
votes

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) ou FCLOSE (STDERR) ).
Cela shup up tout, y compris des choses comme printf ou fprintf (stardr, ...)
Donc, vous continuerez à continuer à utiliser le habituel ou cerr , mais ils seront transformés en godets de bits.


0 commentaires