【问题标题】:Wraps a vector<unsigned char> inside a stream?将 vector<unsigned char> 包装在流中?
【发布时间】:2011-02-14 11:38:25
【问题描述】:

我有一个函数,它以 std::istream& 作为参数并将转换后的流写入 std::ostream&。

另一方面,我有另一个接受向量参数的函数。

我的目标是将第一个函数的输出传递给第二个函数。

有什么开箱即用的方法吗? 不然怎么轻松实现呢?

谢谢

编辑:这是 2 个函数签名:

functionA(std::istream& _in, std::ostream& _out);
functionB(std::vector<unsigned char>& data);

调用者看起来像:

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

【问题讨论】:

  • 这两个函数签名/标题是什么?
  • 有了更多信息,我可以让我的答案更加具体。一些示例代码带有“如何将 X 转换为 Y?”的注释。在适当的地方会有帮助
  • 如果它是你传递给第二个函数的第一个函数的结果,你为什么不在第一个函数中直接生成一个vector
  • 您不能将输出流转换为类似矢量的输入。这将需要某种生成器概念,这在 C++ 中不存在。很难说解决方案是什么,不知道这些函数到底是什么进出。
  • @Marcelo - 如果你可以强制输出流是一个 std::stringstream 它是微不足道的

标签: c++ stl


【解决方案1】:

我认为这样的事情可能会奏效

std::vector<unsigned char> data;
std::istringstream stream_in("input message");
std::stringstream stream_out;
functionA(stream_in, stream_out);
const std::string& str_out(stream_out.str());
copy(str_out.begin(), str_out.end(), std::back_inserter(data));
functionB(data);

【讨论】:

  • 最好!我正要发布这个解决方案!
  • +1。我会在 functionA() 调用之后使用std::vector&lt;unsigned char&gt; data(stream_out.begin(), stream_out.end());,但这只是一个小细节。
  • 我试过了,但是编译器在 std::ostringstream 上没有找到 begin() 和 end()。我将其更改为 stream_out.str().begin() 和 stream_out.str().end(),但是在运行时我收到一条奇怪的消息:“字符串迭代器不兼容”。我尝试用 vector:: 替换 vector 但没有帮助。
  • @PeeWee 现在应该可以工作了。忘记了流的额外迭代器。请注意,当默认构造指向“EOF”时,与其他迭代器流迭代器不同,不需要其他迭代器来执行此操作。
  • @RedX 我现在可以让它工作,“字符串迭代器不兼容”消息出现,因为 stream_out.str() 每次创建一个新的字符串对象。如果我首先将字符串存储在局部变量中并将其用于开始和结束,它就可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2014-12-11
相关资源
最近更新 更多