【发布时间】:2015-12-01 07:12:42
【问题描述】:
我很难让 istreambuf_iterator 与除 char 之外的其他类型一起工作。我们都知道您可以将流转换为这样的范围:
istreambuf_iterator<char>(ifstream("some_file")) //now we have an iterator that reads chars each step.
我有一个结构的二进制流,而不是字符。所以我需要能够做到这一点:
istreambuf_iterator<MyStruct>(ifstream("some_file"))
我想轻松地遍历流中的所有 MyStruct。这我无法开始工作,因为 ifstream 是一个 istream,它是一个 basic_istream<char>,它只适用于 istreambuf_iterator<char>,而不是 istreambuf_iterator<MyStruct>。
我已经编写了自己的迭代器,但我想使用 STD 迭代器,因为它看起来很完美。他们为什么要做这样的事情?为什么我不能使用 istreambuf_iterator 迭代 ifstream 中的结构?
编辑:
人们建议将 istream_iterator 与 operator>> 的自定义实现一起使用。这将起作用,但对于我的特定用途,我需要阅读特定数量的 MyStruct,直到 EOF。该流包含 5 个 MyStruct,然后包含更多不应该作为 MyStruct 读取的数据。所以我需要通过像这样偏移“开始迭代器”来为范围创建“结束迭代器”:
auto begin = istream_iterator<MyStruct>(the_istream);
auto end = istream_iterator<MyStruct>(the_istream) + 5;
但是这个我不知道有没有可能。
拥有一个具有所有这些功能的完全标准的 STL 迭代器会很好,而且如果标准迭代器经过深思熟虑,它们似乎很容易涵盖所有这些用例。我想最短和最简单的解决方案是继续使用我的自定义迭代器。
【问题讨论】:
-
你为什么不使用
istream_iterator? -
因为没有为 MyStruct 定义运算符>>。也许重载 + istream_iterator 是我能得到的最接近的?任何自动获取如何读取 MyStruct 的 binary_istream_iterator?
-
你为什么不做一个
istream& operator>>(istream&, MyStruct&)?这就是你应该做的。