C++ 调整C++;std/boost iostreams提供对内存块的循环写入

C++ 调整C++;std/boost iostreams提供对内存块的循环写入,c++,boost,iostream,C++,Boost,Iostream,背景: 我正在尝试优化日志系统,以便它使用内存映射文件。我需要提供一个类似std::ostream的接口,以便日志系统可以写入该内存。 我已经确定std::strstream(虽然已弃用)和boost::iostreams::basic_array_sink可以满足我的需要 现在我想让日志循环,这意味着当输出指针接近内存块的末尾时,它应该重新开始。 我的问题是,实施这一特定行为的最佳起点是哪里 我被std::iostreams类层次结构弄得不知所措,现在还没有掌握所有的内部工作。 我不确定我是否

背景: 我正在尝试优化日志系统,以便它使用内存映射文件。我需要提供一个类似std::ostream的接口,以便日志系统可以写入该内存。 我已经确定std::strstream(虽然已弃用)和boost::iostreams::basic_array_sink可以满足我的需要

现在我想让日志循环,这意味着当输出指针接近内存块的末尾时,它应该重新开始。 我的问题是,实施这一特定行为的最佳起点是哪里

我被std::iostreams类层次结构弄得不知所措,现在还没有掌握所有的内部工作。 我不确定我是否应该/需要从ostream、streambuf或两者中派生? 不管怎么说,这些都是用来衍生的吗

或者使用boost:iostreams,我是否需要编写自己的接收器


编辑: 以下尝试编译并生成预期输出:

class rollingstreambuf : public std::basic_streambuf<TCHAR>
{
public:
    typedef std::basic_streambuf<TCHAR> Base;

    rollingstreambuf(Base::char_type* baseptr, size_t size)
    {
        setp(baseptr, baseptr + size);
    }

protected:
    virtual int_type overflow (int_type c)
    {
        // reset position to start of buffer
        setp(pbase(), epptr());
        return putchar(c);
    }

    virtual std::streamsize xsputn (const char* s, std::streamsize n)
    {
        if (n >= epptr() - pptr())
            // reset position to start of buffer
            setp(pbase(), epptr());
        return Base::xsputn(s, n);
    }
};

char buffer[100];
rollingstreambuf buf(buffer, sizeof(buffer));
std::basic_ostream<TCHAR> out(&buf);

for (int i=0; i<10; i++)
{
    out << "Mumblemumble " << i << '\n';
}
out << std::ends;  //write terminating NULL char
(确认已发生翻滚)

它所做的是使streambuf将提供的缓冲区用作循环输出缓冲区(put区域),而不会在输出序列(stream)中推进缓冲区窗口。 (使用来自的术语)


现在我对这个实现的健壮性和质量感到非常不确定。请检查并评论。

这是一种有效的方法<代码>溢出()应返回:

traits::eof()或在函数失败时引发异常。否则,返回traits::eof()以外的值以指示成功

例如:

xsputn()。您可能不需要使用默认的
xsputn()
实现,它为每个字符调用
sputc(c)
,然后在缓冲区已满时调用
overflow()

Mumblemumble 6
Mumblemumble 7
Mumblemumble 8
Mumblemumble 9
virtual int_type overflow (int_type c)
{
    // reset position to start of buffer
    setp(pbase(), epptr());
    return traits::not_eof(c);
}