我有一个存储块(不透明),我想在通过它们的C ++适配器mySQL中的Blob来存储。该适配器需要一个istream的:

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

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

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

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

,因为标准::流缓冲不必须这样构造。我看到以下建议。

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

是正确的方法是什么?

有帮助吗?

解决方案

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

 istrstream( char* pch, int nLength );

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

的讨论

其他提示

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

e.g:

#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();
}

了Boost.Iostreams具有像一个字符串流的流,但包装天然数组,因此避免必须复制数据。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top