0

我一直在尝试通过 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 */
};

现在说我想将 this 流式传输到 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 的定义行为。当我使用字符串流时,我可以读入一个 int 而无需做任何特别的事情。

所以如果有人有任何见解,请赐教。

4

2 回答 2

0

所有 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;将完成其余的工作。

于 2013-04-24T16:28:55.137 回答
0

boost::iostreams::stream 没有参数的构造函数什么都不做,结果流没有打开。您需要向 my_source 构造函数添加假参数。

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

boost::iostreams::stream<my_source> stream(0);
于 2013-12-20T22:52:30.360 回答