相关疑难解决方法(0)

从char获取一个istream*

我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.

我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.

有没有办法从char*创建一个istream,它的大小没有复制所有数据?

c++ istream

51
推荐指数
5
解决办法
4万
查看次数

设置标准流使用的内部缓冲区(pubsetbuf)

我正在编写一个需要将数据写入现有缓冲区的子程序,我想使用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++ stream visual-c++

24
推荐指数
2
解决办法
2万
查看次数

从内存缓冲区初始化C++ std :: istringstream?

我有一个内存块(不透明),我想通过他们的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)

这是正确的方法吗?

c++ streambuf

14
推荐指数
3
解决办法
1万
查看次数

继承std :: istream或等效项

我需要在流上桥接两个库.

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的类.以前有人这样做过吗?

如果我认为不是正确的方式,我想知道实现这一目标的最佳方法是什么.

c++ qt iostream

12
推荐指数
2
解决办法
6307
查看次数

如何从矢量char初始化字符串流

目前我正在使用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_

c++ string vector istringstream

4
推荐指数
1
解决办法
2637
查看次数

在流中包含向量<unsigned char>吗?

我有一个函数,它将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)

c++ stl

3
推荐指数
1
解决办法
1572
查看次数

标签 统计

c++ ×6

iostream ×1

istream ×1

istringstream ×1

qt ×1

stl ×1

stream ×1

streambuf ×1

string ×1

vector ×1

visual-c++ ×1