带结构的istreambuf_iterator

时间:2015-12-01 07:12:42

标签: c++ iterator

我很难让istreambuf_iterator与char以外的其他类型一起工作。我们都知道您可以将流转换为这样的范围:

The specified file or directory is invalid

我有一个结构的二进制流,而不是字符。所以我需要能够做到这一点:

istreambuf_iterator<char>(ifstream("some_file")) //now we have an iterator that reads chars each step.

我希望能够轻松地遍历流中的所有MyStruct。这个我无法开始工作,因为ifstream是一个istreambuf_iterator<MyStruct>(ifstream("some_file")) 的istream,它只与basic_istream<char>合作,而不是istreambuf_iterator<char>

我已经编写了自己的迭代器,但是我想使用STD迭代器,因为它看起来很完美。他们为什么要做这样的事情?为什么我不能使用istreambuf_iterator迭代ifstream中的结构?

编辑:

人们建议将istream_iterator与operator&gt;&gt;的自定义实现结合使用。这将有效,但对于我的具体用途,我需要阅读特定数量的MyStruct,而不是EOF。该流包含5个MyStruct,然后包含更多不应被视为MyStructs的数据。所以我需要创建&#34; end-iterator&#34;通过抵消&#34;开始迭代器&#34;像这样:

istreambuf_iterator<MyStruct>

但我不知道这是否可能。

拥有一个具有所有这些功能的完全标准的STL迭代器会很好,如果标准迭代器有点经过深思熟虑,它们似乎很容易涵盖所有这些用例。我想最简单和最简单的解决方案是继续使用我的自定义迭代器。

1 个答案:

答案 0 :(得分:0)

ArrayAdapterifstream的typedef。由于您使用的输入流类似于包含basic_ifstream<char> s,因此您只能迭代char并不奇怪。您可能会想到尝试这个(我做过):

char

但它不起作用,因为它需要istreambuf_iterator<MyStruct>(basic_ifstream<MyStruct>("some_file")) char_traits类,而MyStruct又需要定义一个char_traits,在这种情况下,它将是一个int_type包含MyStruct的整数。大概MyStruct不能存储在任何整数类型中,所以我们运气不好。

我假设你已经知道你可以重载operator>>(istream&, MyStruct&) ....