我很难让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迭代器会很好,如果标准迭代器有点经过深思熟虑,它们似乎很容易涵盖所有这些用例。我想最简单和最简单的解决方案是继续使用我的自定义迭代器。
答案 0 :(得分:0)
ArrayAdapter
是ifstream
的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&)
....