从初始化一个C ++的std :: istringstream在存储器缓冲器?
题
我有一个存储块(不透明),我想在通过它们的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
建设和underflow
和uflow
读取区域可以放心地离开返回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虽然已经提到。