繁体   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