我想把数据发送到任何地方,我的意思是我不想在控制台或文件中打印数据,但我需要一些std::ostream
对象。如何做到这一点?
我使用过:
std::ostream bitBucket(0);
最近没有问题,尽管如果你从某个角度来看它,它被标记为有一些潜在的问题(请参阅下面的链接(。
除此之外:据我所知(我不完全相信这一点(,上面的调用最终会调用
basic_ios::init(0)
,因为这是一个传入的NULL指针,它将rdstate()
函数返回的流状态设置为badbit
值。这反过来又阻止了流输出更多的信息,而只是将其丢弃。
以下程序显示了它的作用:
#include <iostream>
int main (void) {
std::ostream bitBucket(0);
bitBucket << "Hello, there!" << std::endl;
return 0;
}
我得到它的页面上也有一个可能更干净的解决方案(稍作修改以删除上面第一个解决方案的重复(:
#include <iostream>
class null_out_buf : public std::streambuf {
public:
virtual std::streamsize xsputn (const char * s, std::streamsize n) {
return n;
}
virtual int overflow (int c) {
return 1;
}
};
class null_out_stream : public std::ostream {
public:
null_out_stream() : std::ostream (&buf) {}
private:
null_out_buf buf;
};
null_out_stream cnul; // My null stream.
int main (void) {
std::cout << std::boolalpha;
//testing nul
std::cout << "Nul stream before: " << cnul.fail() << std::endl;
cnul << "Goodbye World!" << std::endl;
std::cout << "Nul stream after: " << cnul.fail() << std::endl;
}
最简单的解决方案就是输出到未打开的std::ofstream
(或处于错误状态的任何其他输出流(。这将导致流永久处于错误状态。这可能是一个优势(<<
运算符将跳过格式化(,但如果无法控制对错误的检查,并在错误发生时执行特定操作如果发生这种情况,你很可能会遇到问题。
否则,实现一个空流非常简单;唯一的您真正需要覆盖的streambuf
函数是overflow
。下面这样的东西应该能起到作用:
class NulStreambuf : public std::streambuf
{
char dummyBuffer[64];
protected:
virtual int overflow( int c )
{
setp( dummyBuffer, dummyBuffer + sizeof( dummyBuffer ) ) ;
return (c == EOF) ? ' ' : c ;
}
};
(缓冲区将避免一些不必要的虚拟函数调用平台,这会产生显著差异。(
然后创建一个使用它的输出流:
class NulOStream : public NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
};
(使用继承而不是包含可以确保streambuf在被传递到CCD_ 9之前被完全构造。这在实践中通常没有必要,但标准没有似乎授权将尚未构建的streambuf
传递给ostream
的构造函数。(
最简单的解决方案:使用std::stringstream
。
#include <sstream>
#include <iostream>
void func(std::ostream& o){
o << "blatestn";
}
int main(){
std::stringstream black_hole;
func(std::cout);
func(black_hole);
}
stringstream
将包含输出,但如果您不使用它,它就和从未填充过一样。
由于没有人提到它,如果是关于抑制std或错误输出,您可以简单地关闭相应的文件描述符(例如fclose (stdout)
或fclose (stderr)
(
这将关闭所有内容,包括printf
或fprintf (stderr, ...)
因此,您确实会继续使用通常的cout
或cerr
,但它们会变成比特桶。
这里有一些建议:http://bytes.com/topic/c/answers/589209-std-null-stream
来自该网站的一个好答案:
使用普通std::fstream,打开它仅用于写入所需文件"dev/null";。它应该起作用。
如果您真的想创建自己的流,只需从basic_ stream并简单地定义您自己的运算符<lt;发挥作用其仅返回流引用。你必须写dummy"write"one_answers"put"方法(以及用于输出的所有其他方法(。
#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;
发件人http://bytes.com/topic/c/answers/428285-null-ostream