4

我可以查询一个ostream对象是否已被写入吗?对于一个ostringstream,可以使用

if(!myOssObject.str().empty())

一般情况如何,例如ofstreamor coutor cerr

4

2 回答 2

5

一般没有。

您可以通过以下方式找出在刷新(发送缓冲数据)之前写入了多少字符(或其他内容)tellp()

返回当前关联的 streambuf 对象的输出位置指示符。

cout << "123";

if (cout.tellp() > 0)
{
    // There is some data written
}

刷新后,这些输出流将忘记它们所写的内容,但会忘记最后的状态标志。

如果输出设备是实时的并且不缓冲任何东西,那就无能为力了tellp

于 2013-10-15T10:11:08.757 回答
3

这是可能的,但前提是您可以事先掌握流媒体。唯一普遍保证的解决方案是插入一个过滤流缓冲区,它跟踪输出的字符数:

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();

当它超出范围时,它将恢复流的原始状态。

于 2013-10-15T11:28:39.063 回答