簡體   English   中英

boost :: iostreams從源設備讀取

[英]boost::iostreams reading from source device

我一直在嘗試通過boost來推動iostreams庫的發展。

但是我真的不能完全掌握這些概念。

說我有以下課程:

偽代碼 :以下代碼僅用於說明問題。

編輯:刪除了讀取的代碼,因為它消除了對實際問題的關注。

class my_source {
public:
    my_source():value(0x1234) {}
    typedef char        char_type;
    typedef source_tag  category;

    std::streamsize read(char* s, std::streamsize n)
    {
      ... read into "s" ...
    }
private:
    /* Other members */
};

現在說我想將此流傳輸到int。

我需要做什么 ? 我嘗試了以下

boost::iostreams::stream<my_source> stream;
stream.open(my_source());

int i = 0;
stream >> i;
// stream.fail() == true; <-- ??

這將導致失敗,(設置了失敗位)

雖然以下工作正常。

boost::iostreams::stream<my_source> stream;
stream.open(my_source());

char i[4];
stream >> i;    
// stream.fail() == false;

有人可以向我解釋為什么會這樣嗎? 這是因為我已經設置了char_type char嗎?

我真的在任何地方都找不到很好的表現。 我一直在嘗試閱讀文檔,但是如果這是問題,我無法找到char_type的定義行為。 當我使用stringstreams時,我可以讀入int而不做任何特殊的事情。

因此,如果有人有任何見解,請賜教。

所有iostream都是文本流,因此它將采用0x1234的字節表示形式,將其解釋為文本並嘗試將其解析為整數。

順便說說

std::streamsize read(char* s, std::streamsize n)
{
  int size = sizeof(int);
  memcpy(s, &value, 4);
  return size;
}

如果n < 4則有可能發生緩沖區溢出。 另外,您寫入四個字節,然后返回int的大小。 memcpy(s, &value, sizeof value); 將完成此工作, return sizeof value;一個簡單的return sizeof value; 剩下的就做。

沒有參數的boost :: iostreams :: stream構造函數不執行任何操作,結果流未打開。 您需要向my_source構造函數添加假參數。

class my_source {
public:
    my_source(int fake) : value(0x1234) {}
...

boost::iostreams::stream<my_source> stream(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM