我一直试图通过提升来了解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。
所以,如果有人有任何见解,请赐教。
答案 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);