将内存缓冲区写入 std::stringstream

Writing a memory buffer to std::stringstream

本文关键字:std stringstream 内存 缓冲区      更新时间:2023-10-16

>我有一个表示内存缓冲区的类

class Buffer
{
public:
    Buffer(const char* buffer, size_t size)
        :m_buffer(buffer), m_size(size)
    {
    }
    const char* m_buffer;
    size_t m_size;
};

我需要在此类上重载operator<<,以便可以将其写入这样的std::stringstream

char arr[] = "hello world";
Buffer buf(arr, 11);
std::stringstream ss;
ss << buf;

我该怎么做?请注意,内存缓冲区之间可能有 NULL 个字符。另外,由于内存缓冲区可能很大,我想避免制作任何额外的副本(除了复制到字符串流中)。

写入流始终是对输出流完成的。

例如,如果您看到此std::stringstream引用,您将看到它继承自从std::ostream继承的std::iostream(以及从std::istream继承)。

这意味着您只需像这样重载它:

class Buffer
{
public:
    ...
    friend std::ostream& operator<<(std::ostream& os, Buffer const& buf)
    {
        // Code to write the buffer to the stream...
    }
};

当然,这种重载意味着您可以使用 Buffer 类写入任何输出流。

重载函数中写入数据所需的确切内容取决于数据。它可以是任何通用二进制数据,那么您可能应该使用 std::ostream::write .否则,您可以只使用例如 std::string充当中间人:

return os << std::string(m_buffer, m_size);

当然,您需要确保缓冲区不为空或为空指针。

operator<<重载中使用std::ostream::write()将缓冲区写入std::ostream

这将写入所有内容,空字节等。