C++ boost::从源设备读取iostreams

C++ boost::从源设备读取iostreams,c++,boost,boost-iostreams,C++,Boost,Boost Iostreams,我一直想通过boost来了解iostreams库 但是我不能完全理解这些概念 假设我有以下课程: 伪代码:以下代码仅用于说明问题 编辑:删除了已读代码,因为它删除了对实际问题的关注 class my_source { public: my_source():value(0x1234) {} typedef char char_type; typedef source_tag category; std::streamsize read(char*

我一直想通过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;
stream.open(my_source());
int i=0;
流>>i;
//stream.fail()==true;>我
//stream.fail()==false;
有人能给我解释一下为什么会这样吗?这是因为我设置了char\u类型char吗

我在任何地方都找不到好的解释。我一直试图阅读文档,但如果这是问题所在,我找不到为char_类型定义的行为。当我使用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)
将执行此任务,一个简单的
返回sizeof值将完成其余部分。

没有参数的boost::iostreams::stream构造函数不执行任何操作,并且结果流中的流未打开。您需要向我的源构造函数添加伪参数

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

boost::iostreams::stream<my_source> stream(0);
为我的源代码分类{
公众:
my_source(int-false):值(0x1234){}
...
boost::iostreams::stream(0);

@SteveL我理解这一点,但将其传递给整数并不管用,这就是问题的全部。您看到的上面的代码只是将流传递给int的问题的简单表示。我知道并理解所有溢出问题。但我真的不明白为什么将其读取为int会导致失败位,但读取相同的数据假设使用ASCII编码的小尾端系统,则上的四字节整数0x1234将是字符序列{4,DC2,NUL,NUL}。您希望从中得到什么整数?'4'可以解析为文本,甚至可以解析为数字,但设备控件和NUL在文本字符串中没有意义。如果您使用它读取字符序列,它们的实际值没有任何区别,因此它可以工作。即使在那里,我也希望缓冲区溢出上面的代码。如果要使用iostreams读取原始字节,请查看read()函数,而不是
>
。上面的代码只是为了说明问题。我的问题是,为什么将流读入int会导致流。fail()==true。将流读入char[4]可以。是“abcd”吗四个字符?是的。是整数吗?不是。这就是区别!字符“abcd”只是内存中4个字节的表示,如果我愿意的话,我可以将它们cpy成一个int。底层流不可能知道它读取的字节流最初是一个int还是一个字符序列。所以我的问题仍然是,我需要做什么才能使它将数据读入int。从我的观点来看,如果我将int传递给>>操作符,我会说它会查看结构的大小,并将适当数量的数据复制到其中。但显然这并不是我们要做的。我想知道为什么。
class my_source {
public:
    my_source(int fake) : value(0x1234) {}
...

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