[英]istreambuf_iterator with structs
我很难让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>
一起使用,所以我无法使用istreambuf_iterator<MyStruct>
。
我已经编写了自己的迭代器,但是我想使用STD迭代器,因为它看起来很完美。 他们为什么做这样的事情? 为什么我不能使用istreambuf_iterator遍历ifstream中的结构?
编辑:
人们建议将istream_iterator与运算符>>的自定义实现一起使用。 这将起作用,但是对于我的特定用途,我需要读取特定数量的MyStruct,直到EOF为止。 该流包含5个MyStruct,然后包含不应视为MyStructs的更多数据。 因此,我需要通过抵消“ begin-iterator”来为范围创建“ end-iterator”:
auto begin = istream_iterator<MyStruct>(the_istream);
auto end = istream_iterator<MyStruct>(the_istream) + 5;
但这我不知道是否可能。
拥有一个具有所有这些功能的完全标准的STL迭代器将是很好的,而且如果对标准迭代器进行更多的考虑,它们似乎可以轻松涵盖所有这些用例。 我猜最简单快捷的解决方案是继续使用我的自定义迭代器。
ifstream
是basic_ifstream<char>
的typedef。 由于您使用的流的类型好像包含char
,因此仅对char
进行迭代就不足为奇了。 您可能会想尝试一下(我做到了):
istreambuf_iterator<MyStruct>(basic_ifstream<MyStruct>("some_file"))
但这是行不通的,因为它需要MyStruct
的char_traits
类,而char_traits
反过来又需要定义一个int_type
,在这种情况下,该int_type
将是一个保存MyStruct
的整数。 大概MyStruct
不能以任何整数类型存储,因此我们很不走运。
我假设您已经知道可以重载operator>>(istream&, MyStruct&)
....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.