我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.
我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.
有没有办法从char*创建一个istream,它的大小没有复制所有数据?
我正在编写一个需要将数据写入现有缓冲区的子程序,我想使用stringstream该类来简化数据的格式化.
最初,我使用以下代码将流的内容复制到缓冲区,但是希望避免这种解决方案,因为它复制了太多数据.
#include <sstream>
#include <algorithm>
void FillBuffer(char* buffer, unsigned int size)
{
std::stringstream message;
message << "Hello" << std::endl;
message << "World!" << std::endl;
std::string messageText(message.str());
std::copy(messageText.begin(), messageText.end(), buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是我发现streambuf::pubsetbuf()方法的时候,简单地重写上面的代码如下.
#include <sstream>
void FillBuffer(char* buffer, unsigned int size)
{
std::stringstream message;
message.rdbuf()->pubsetbuf(buffer, size);
message << "Hello" << std::endl;
message << "World!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这在Visual Studio 2008附带的C++标准库实现下不起作用; buffer保持不变.
我看了一下它的实现,pubsetbuf结果发现它实际上"什么都不做".
virtual _Myt *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize)
{ // offer buffer to external …Run Code Online (Sandbox Code Playgroud) 我有一个内存块(不透明),我想通过他们的C++适配器存储在mySQL的Blob中.适配器需要一个istream:
virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如何从这个内存块创建一个std :: istream(键入为char*).它不是一个字符串,因为它不是以空值终止的(但我知道它的长度当然).
如果没有复制我的内存块,例如在std :: string中,我找不到一种方法.我认为这有点浪费.这样的东西不起作用:
std::streambuf istringbuf(blockPtr, blockLength);
std::istringstream tmp_blob(&istringbuf);
Run Code Online (Sandbox Code Playgroud)
因为std :: streambuf没有这样的构造函数.我看到了以下建议.
std:: istringstream tmp_blob;
tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
我需要在流上桥接两个库.
QDataStream which is a stream from Qt
Run Code Online (Sandbox Code Playgroud)
以及来自其他库的一些函数看起来像这样
void read_something(istream& i);
Run Code Online (Sandbox Code Playgroud)
我无法控制如何创建QDataStream,我不允许更改read_somthing函数的接口.
我能想到的第一件事就是编写一个继承istream并包装QDataStream的类.以前有人这样做过吗?
如果我认为不是正确的方式,我想知道实现这一目标的最佳方法是什么.
目前我正在使用boost char数组
boost::array<char, 512> received_data;
std::istringstream ss_(received_data.data());
Run Code Online (Sandbox Code Playgroud)
但是如果我的received_data是一个 std::vector<char> received_data(512);
我怎么才能把这些数据发给我std::istringstream ss_?
我有一个函数,它将std :: istream&作为参数,并将转换后的流写入std :: ostream&.
另一方面,我有另一个接受vector参数的函数.
我的目标是将第一个函数的输出传递给第二个函数.
是否有开箱即用的东西?否则,我该如何轻松实现它?
谢谢
编辑:这里有2个功能签名:
functionA(std::istream& _in, std::ostream& _out);
functionB(std::vector<unsigned char>& data);
Run Code Online (Sandbox Code Playgroud)
来电者看起来像:
std::vector<unsigned char> data;
std::istrstream stream_in("input message");
std::ovectorstream stream_out(data); // ???
functionA(stream_in, stream_out);
functionB(stream_out.vector());
Run Code Online (Sandbox Code Playgroud)