从初始化一个C ++的std :: istringstream在存储器缓冲器?(initializi

2019-07-18 14:26发布

我有一个内存块(不透明),我想通过自己的C ++适配器在MySQL中的Blob存储。 该适配器需要一个istream的:

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;

所以我的问题是:如何可以从这个内存块(类型为char *)创建一个std :: istream的。 这不是一个字符串,因为它是不是空终止(但我知道它的路线的长度)。

我无法找到一个方法来做到这一点没有为std :: string复制我的记忆区块为例。 我认为这是一个有点浪费。 像这样的东西不起作用:

    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);

因为性病::流缓冲可是没有这样的构造。 我看到了以下建议。

    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);

那是正确的方法是什么?

Answer 1:

看的std :: istrstream它有一个构造函数

 istrstream( char* pch, int nLength );

这个类是有点贬值或至少你通常告知使用其他类。
与strstream的问题是,它是更为复杂的管理的char *缓冲区的内存所以一般因为它的内存管理你,你宁愿stringstream的。 然而,在这种情况下,你已经管理的char *的内存,使正常的好处就是在这种情况下成本。 事实上,在这种情况下,strstream正是你想要什么呢,在代码或速度最小的开销。 这是类似的讨论ostrsteram由Herb萨特



Answer 2:

这其实很琐碎写一个一次性std::streambuf使用缓冲的地方作为的所有虚函数的默认行为std::streambuf做“正确的事”。 你可以只setg建设和读取区underflowuflow可以放心地离开返回traits_type::eof()作为初始获取区域的到底是流的末尾。

例如:

#include <streambuf>
#include <iostream>
#include <istream>
#include <ostream>

struct OneShotReadBuf : public std::streambuf
{
    OneShotReadBuf(char* s, std::size_t n)
    {
        setg(s, s, s + n);
    }
};

char hw[] = "Hello, World!\n";

int main()
{
    // In this case disregard the null terminator
    OneShotReadBuf osrb(hw, sizeof hw - 1);
    std::istream istr(&osrb);

    istr >> std::cout.rdbuf();
}


Answer 3:

了Boost.Iostreams有像一个字符串流流,但包装原生数组,所以你无需复制数据。

的std :: stringstream的总是创建自己的内部缓冲区



Answer 4:

未经测试,但也许值得一试...

std::stringstream ss;
ss.write( blockPtr, blockLength );
ss.seekg(0);

然后调用与SS该功能的setBlob。 你仍然有性病:: stringstream的内部缓冲区jalf虽然已经提到。



文章来源: initializing a C++ std::istringstream from an in memory buffer?
标签: c++ streambuf