scd*_*dmb 9 c++ printing stream
我想将数据发送到任何地方,我的意思是我不想在控制台或文件中打印数据,但我需要一些std::ostream对象.怎么做?
pax*_*blo 13
我用过:
std::ostream bitBucket(0);
Run Code Online (Sandbox Code Playgroud)
最近没有问题,虽然如果你从某个角度看它有一些潜在的问题(见下面的链接).
旁白:根据我的理解(我并不完全确定),上面的调用最终会调用
basic_ios::init(0),因为传入的是NULL指针,它会将rdstate()函数返回的流状态设置为badbit值.这反过来又阻止了流输出更多信息,而只是将其丢弃.
以下程序显示了它的运行情况:
#include <iostream>
int main (void) {
std::ostream bitBucket(0);
bitBucket << "Hello, there!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我从中得到它的页面也有一个可能更清晰的解决方案(稍作修改以删除上面第一个解决方案的重复):
#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;
}
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是输出到未打开的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 ;
}
};
Run Code Online (Sandbox Code Playgroud)
(缓冲区将避免一些不必要的虚函数调用.在某些平台上,这会产生显着的差异.)
然后创建一个使用它的输出流:
class NulOStream : public NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
};
Run Code Online (Sandbox Code Playgroud)
(继承的使用,而不是包含,确保streambuf在传递给之前是完全构造的ostream.这在实践中通常是不必要的,但是标准似乎没有授权将尚未构造的传递给构造streambuf函数ostream.)