繁体   English   中英

istreambuf_iterator与结构

[英]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迭代器将是很好的,而且如果对标准迭代器进行更多的考虑,它们似乎可以轻松涵盖所有这些用例。 我猜最简单快捷的解决方案是继续使用我的自定义迭代器。

ifstreambasic_ifstream<char>的typedef。 由于您使用的流的类型好像包含char ,因此仅对char进行迭代就不足为奇了。 您可能会想尝试一下(我做到了):

istreambuf_iterator<MyStruct>(basic_ifstream<MyStruct>("some_file"))

但这是行不通的,因为它需要MyStructchar_traits类,而char_traits反过来又需要定义一个int_type ,在这种情况下,该int_type将是一个保存MyStruct的整数。 大概MyStruct不能以任何整数类型存储,因此我们很不走运。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM