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

时间:2016-06-05 16:53:40

标签: c++ stringstream

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

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个字符。此外,由于内存缓冲区可能很大,我想避免为此创建任何额外的副本(除了复制到stringstream中)。

2 个答案:

答案 0 :(得分:4)

始终对输出流写入流。

如果您看到例如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类来写入任何输出流。

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

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

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

答案 1 :(得分:1)

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

这将写入所有内容,null bytes,等等。