2011-06-15 51 views
4

我想用std :: istream作为数据源。我想自定义二进制数据放在istream的流缓冲区中,以便稍后可以从istream中检索它。如何手动将数据放入boost :: asio :: streambuf以便稍后使用std :: istream读取它?

我已阅读关于boost :: asio :: streambuf以及它如何用来做我想要的,但使用套接字作为数据源而不是内存缓冲区,这是我想要使用的。

从我从documentation理解,步骤应该是:

  1. 创建一个boost :: ASIO ::流缓冲
  2. 创建一个std :: istream的传递流缓冲
  3. 调用提升: :asio :: streambuf ::准备获取表示输出序列的缓冲区列表。
  4. 以某种方式写入输出序列。
  5. 调用boost :: asio :: streambuf :: commit将我在输出序列中写入的内容移动到输入序列。
  6. 通常使用std :: stream :: read从步骤2的std :: istream中读取。

我不知道如何解决第4步,所以我不知道即使我正朝着正确的方向前进。

所描绘的步骤是否正确?如果是这样,如何解决第4步?

+0

相关:是否有可能从CIN “准备” 输入?](http://stackoverflow.com/questions/6013638/is-it-possible-to-prepare-input-from -cin)。 – Xeo 2011-06-15 19:31:43

+0

@Xeo这正是我想要做的,但用二进制数据而不是文本。据我所知,stringstream是不可能的。我对吗?是否有任何其他流程实现可用于此? – ncasas 2011-06-15 20:05:35

回答

6

你可以很容易地发送任何标准流,所以你也可以你stringstream。您可以将二进制数据写入您的字符串流(它只是一个字节数组,有效地)。

几样:

boost::asio::streambuf request; 
std::ostream request_stream(&request); 
request_stream.write(&binarydata_buf, sizeof(binarydata_buf)); 
// or use stream operators: request_stream << "xxx" << yyy; 

// Send the request. 
boost::asio::write(socket, request); 

如果你已经有了一个完全填充的IStream(使用的std :: CIN如本例假):

boost::asio::streambuf request; 
std::ostream request_stream(&request); 
request_stream << std::cin.rdbuf() << std::flush; 

// Send the request. 
boost::asio::write(socket, request); 

方法来填充istream的是如ostream::writeBoost Serialization binary_archive

当然有许多方法可以让猫变皮,所以在盲目拷贝它之前一定要考虑其他选项。

How to send ostream via boost sockets in C++?

+0

是啊,这是更好 – totowtwo 2011-06-15 20:26:37

0

为什么不直接通过套接字将数据传输到您的流缓冲区?如果可以将std :: istream链接到正在特定套接字上侦听的asio :: streambuf,只需使用与boost :: asio :: write相同的套接字来发送数据即可。

没有太多的惩罚使用实际的套接字内进程,而不是试图通过访问底层数据结构来模拟它。

+0

wut?这似乎对我有趣的建议 – sehe 2011-06-15 20:04:18

+0

我同意你提出的方法是可行的,但对我来说似乎有点矫枉过正。我的最终目的是单元测试一段面向流的代码,除非真的有必要,否则我不希望引入额外的软件元素。 – ncasas 2011-06-15 20:08:40

+0

你已经在使用boost :: asio了,所以它似乎符合你提出的框架。为什么不只是使用任何streambuf构建的std :: iostream呢?它转化为流言蜚语 – totowtwo 2011-06-15 20:15:44

相关问题