我可以查询一个ostream
对象是否已被写入吗?对于一个ostringstream
,可以使用
if(!myOssObject.str().empty())
一般情况如何,例如ofstream
or cout
or cerr
?
一般没有。
您可以通过以下方式找出在刷新(发送缓冲数据)之前写入了多少字符(或其他内容)tellp()
:
返回当前关联的 streambuf 对象的输出位置指示符。
cout << "123";
if (cout.tellp() > 0)
{
// There is some data written
}
刷新后,这些输出流将忘记它们所写的内容,但会忘记最后的状态标志。
如果输出设备是实时的并且不缓冲任何东西,那就无能为力了tellp
。
这是可能的,但前提是您可以事先掌握流媒体。唯一普遍保证的解决方案是插入一个过滤流缓冲区,它跟踪输出的字符数:
class CountOutput : public std::streambuf
{
std::streambuf* myDest;
std::ostream* myOwner;
int myCharCount; // But a larger type might be necessary
protected:
virtual int overflow( int ch )
{
++ myCharCount;
return myDest->sputc( ch );
}
public:
CountOutput( std::streambuf* dest )
: myDest( dest )
, myOwner( NULL )
, myCharCount( 0 )
{
}
CountOutput( std::ostream& dest )
: myDest( dest.rdbuf() )
, myOwner( &dest )
, myCharCount( 0 )
{
myOwner->rdbuf( this );
}
~CountOutput()
{
if ( myOwner != NULL ) {
myOwner.rdbuf( myDest );
}
}
int count() const
{
return myCount;
}
};
像往常一样,这几乎可以用于任何std::ostream
:
CountOutput counter( someOStream );
// output counted here...
int outputCount = counter.count();
当它超出范围时,它将恢复流的原始状态。