[英]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.