C++ 调整C++;std/boost iostreams提供对内存块的循环写入
背景: 我正在尝试优化日志系统,以便它使用内存映射文件。我需要提供一个类似std::ostream的接口,以便日志系统可以写入该内存。 我已经确定std::strstream(虽然已弃用)和boost::iostreams::basic_array_sink可以满足我的需要 现在我想让日志循环,这意味着当输出指针接近内存块的末尾时,它应该重新开始。 我的问题是,实施这一特定行为的最佳起点是哪里 我被std::iostreams类层次结构弄得不知所措,现在还没有掌握所有的内部工作。 我不确定我是否应该/需要从ostream、streambuf或两者中派生? 不管怎么说,这些都是用来衍生的吗 或者使用boost:iostreams,我是否需要编写自己的接收器C++ 调整C++;std/boost iostreams提供对内存块的循环写入,c++,boost,iostream,C++,Boost,Iostream,背景: 我正在尝试优化日志系统,以便它使用内存映射文件。我需要提供一个类似std::ostream的接口,以便日志系统可以写入该内存。 我已经确定std::strstream(虽然已弃用)和boost::iostreams::basic_array_sink可以满足我的需要 现在我想让日志循环,这意味着当输出指针接近内存块的末尾时,它应该重新开始。 我的问题是,实施这一特定行为的最佳起点是哪里 我被std::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);
}