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