有没有办法在std :: stringbuf之前添加固定数量的字节?

时间:2017-08-14 16:31:04

标签: c++ stl stream buffer stringstream

我正在尝试将4字节标头添加到现有的std::stringbuf对象中。例如,如果stringbuf中的数据为‘h’,’e’,’l’,’l’,’o’且标头为‘0x00’,’0x10’, ‘0x00’,’0x0a’,那么我需要将stringbuf更改为‘0x00’,’0x10’, ‘0x00’,’0x0a’, ‘h’,’e’,’l’,’l’,’o’。 我一直在尝试以下方法,但它是无效的,因为它在sbufTextStream和buff中有三个数据副本。使用new char[]更有问题,因为它需要连续的内存块,而且我可以拥有非常大的流。

有人可以通过向我展示如何以更优化的方式做到这一点来帮助我吗?我的意思是有没有办法在现有的stringbuf之前预先添加字节?

std::stringbuf CreateStreamWithHeader(std::stringbuf &sbuf)
{
    int i = sbuf.str().size();
    std::stringbuf TextStreambuf;
    uint32_t streamsize = sbuf.str().size();
    char* buff = new char [streamsize + 5]; //Using char buffer is not memory efficient as it needs a big contonuous chunk of memory.

    ZeroMemory(buff, (streamsize + 5)*sizeof(char));

    buff[0] = (streamsize >> 24) & 0xFF; //In my case header needs to contain size of data in sbuf
    buff[1] = (streamsize >> 16) & 0xFF;
    buff[2] = (streamsize >> 8) & 0xFF;
    buff[3] = (streamsize >> 0) & 0xFF;
    strcpy(&buff[4], sbuf.str().c_str()); //strcpy is not the right solution because it will fail if there’s a NULL character in sbuf
memcpy(&buff[4], sbuf.str().c_str(), streamsize);
    TextStreambuf.sputn(buff, streamsize + 4);
    delete []buff;
    return TextStreambuf;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::stringbuf  stringbuffer, finalstringbuffer;
    stringbuffer.sputn("This is a some string for testing", 33);
    finalstringbuffer = CreateStreamWithHeader(stringbuffer);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

你可以而且应该在没有预先支出的情况下这样做:

  1. 记录streambuf位置
  2. 向前搜索或写一个大小正确的占位符
  3. 写下您的其他数据。
  4. 回到开头。
  5. 使用最终值覆盖占位符。