我想将数据发送到任何地方,我的意思是我不想在控制台或文件中打印数据,但我需要一些std::ostream
对象。怎么做?
答案 0 :(得分:12)
我用过:
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;
}
The page where I got it from也将此作为一种可能更清晰的解决方案(稍作修改以删除上述第一个解决方案的重复):
#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;
}
答案 1 :(得分:5)
最简单的解决方案是输出到未打开的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) ? '\0' : c ;
}
};
(缓冲区将避免一些不必要的虚函数调用。在某些情况下 平台,这会产生重大影响。)
然后创建一个使用它的输出流:
class NulOStream : public NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
};
(继承的使用,而不是包容,确保了
streambuf在传递给ostream
之前已完全构建。
这在实践中通常不是必需的,但标准没有
似乎授权将尚未构建的streambuf
传递给。{
ostream
的构造函数。)
答案 2 :(得分:2)
最简单的解决方案:使用std::stringstream
。
#include <sstream>
#include <iostream>
void func(std::ostream& o){
o << "blatest\n";
}
int main(){
std::stringstream black_hole;
func(std::cout);
func(black_hole);
}
stringstream
将包含输出,但是如果你不使用它,它就像它从未被填充一样。
答案 3 :(得分:0)
这里有一些建议http://bytes.com/topic/c/answers/589209-std-null-stream
该网站的一个很好的答案
使用普通的std :: fstream,只打开它来写入所需的文件 “的/ dev / null的”。它应该工作。
如果你真的想创建自己的流,只需从中派生出来 basic_ostream并简单地定义您自己的运算符&lt;&lt;是功能 它只返回流引用。你将不得不写假 'write'和'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;
答案 4 :(得分:0)
由于没有人提及它,如果它是关于抑制标准输出或错误输出,您只需关闭相应的文件描述符(例如fclose (stdout)
或fclose (stderr)
)。
这会使一切变得清晰,包括printf
或fprintf (stderr, ...)
之类的内容
所以你确实会继续使用通常的cout
或cerr
,但它们会变成比特桶。