gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:43:55 32 4
gpt4 key购买 nike

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

现在我想要循环记录,这意味着当输出指针接近内存块的末尾时,它应该再次从头开始。我的问题是,为了实现这一特定行为,最好从哪里开始。

我对 std::iostreams 类层次结构感到不知所措,目前还没有掌握所有内部工作原理。我不确定我是否应该/需要从 ostream、streambuf 或两者派生?无论如何,这些都是为了派生而制作的吗?

或者使用 boost:iostreams,我是否需要编写自己的 Sink?


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

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

打印缓冲区给出:

Mumblemumble 6
Mumblemumble 7
Mumblemumble 8
Mumblemumble 9

(确认翻转已经发生)

它的作用是让 streambuf 使用提供的缓冲区作为循环输出缓冲区(放置区),而无需在输出序列(流)中推进缓冲区窗口。(使用 http://en.cppreference.com/w/cpp/io/basic_streambuf 中的术语)

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

最佳答案

这是一个有效的方法。 overflow() 应该返回:

traits::eof() or throws an exception if the function fails. Otherwise, returns some value other than traits::eof() to indicate success.

例如:

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

xsputn() 可能应该将序列的开头写入缓冲区的末尾,然后倒回并将剩余的序列写入缓冲区的前面。你可能会逃避 xsputn() 的默认实现,它为每个字符调用 sputc(c),然后在 overflow() 时缓冲区已满。

关于c++ - 调整 C++ std/boost iostreams 以提供对内存块的循环写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597562/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com