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

Writing a memory buffer to std::stringstream

我有一个 class 表示内存中的缓冲区

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

    const char* m_buffer;
    size_t m_size;
};

我需要在此 class 上重载 operator<< 以便它可以像这样写入 std::stringstream

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

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

写入流总是写入输出流。

如果你看到例如this std::stringstream reference 你会看到它继承自 std::iostream,后者继承自 std::ostream(以及 std::istream)。

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

class Buffer
{
public:
    ...

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

这种重载当然意味着您可以使用 Buffer class 写入 any 输出流。

重载函数究竟需要什么来写入数据取决于数据。它可以是任何通用二进制数据,那么您应该使用 std::ostream::write。否则你可以只使用例如std::string充当中间人:

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

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

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

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