2011-06-15 52 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

相關問題