boost :: iostreams从源设备读取

时间:2013-04-24 15:05:15

标签: c++ boost boost-iostreams

我一直试图通过提升来了解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; <-- ??

这会导致失败,(设置failbit)

虽然以下工作正常。

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。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

没有参数的

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

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

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