2016-06-05 4 views
0

У меня есть класс, который представляет собой буфер в памятиЗапись буфера памяти для STD :: 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 символов. Кроме того, поскольку буфер памяти может быть большим, я хочу избежать дополнительных копий этого (кроме копирования в строковый поток).

ответ

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); 

Вы, конечно, нужно, чтобы убедиться, что буфер не пуст, или пустой указатель.

+0

Не могли бы вы помочь мне с тем, что должно входить в эту функцию (код для записи буфера в поток)? Благодарю. – tcb

+0

Я бы хотел избежать дополнительных копий буфера (в промежуточную строку std ::) – tcb

+2

Внутри определения функции 'friend':' return os.write (buf.m_buffer, buf.m_size); 'Предостережение существует, потому что 'write' принимает подписанный параметр целочисленного размера (тип' std :: streamsize'), чей счетчик бит обычно соответствует или превышает 'size_t', поэтому, если вы хотите обеспечить поддержку очень больших буферов, вам нужно будет проверить максимальный' std :: streamsize', а если 'm_size' больше, разбейте операцию записи на несколько кусков. –

1

Используйте std::ostream::write() в своей operator<< перегрузке, чтобы записать буфер в std::ostream.

Это будет писать все, null bytes, et al.

Смежные вопросы