使用迭代器读取格式化的流是一件好事吗?

时间:2013-02-25 15:44:48

标签: c++ stream iterator operators

我编写了一个类,它像迭代器一样解析CSV格式的文件。 我还编写了其他类来读取特定的csv文件以直接填充MyObject结构。因此可以像这样使用类(我删除了代码的错误处理部分):

std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
   MyObject b = *it; 
   // do some stuff here ...
}

该程序运行良好,我对它很满意,但我意识到迭代器的隐含意义(仅适用于我自己?)是它将遍历集合。在这种情况下,除了流之外没有集合。

我是否应该选择明确建议我通过重载使用流的表单>>操作者 因此有类似的东西:

std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
    // do the same "some stuff" here...
}

这只是品味问题吗? 我没有看清楚有什么区别(除了第二种形式的对象只是填充而不是复制)以及选择第一种或第二种形式的后果是什么。

我很乐意得到一些其他的意见,以便确切地知道为什么我使用的是解决方案而不是另一种解决方案。

2 个答案:

答案 0 :(得分:6)

如果需要,您可以将流视为集合。

但是,我注意到,通过重载operator>>,您可以同时使用两者 - 您可以直接使用operator>>来显式读取流中的数据可以使用std::istream_iterator<whatever>将流视为集合来将流视为集合。

在这种情况下,在我看来,重载operator>>是显而易见的选择,因为那时你可以用任何方式处理事情,基本上没有额外的工作。此外,使用std::istream_iterator<x>是一个相当容易识别的习惯用法,因为它包含在标准库中。

答案 1 :(得分:2)

迭代的概念不依赖于容器的概念。 迭代器迭代一系列值。不同的迭代器 设计以不同的方式定义序列,但有 永远是当前价值的思想,进步到底。 关于输入迭代器的唯一问题是它们只是 终止于文件的末尾;你不能说,例如,那 接下来的10行包含双打,然后我们继续 别的。 (但是,当然,您可以插入过滤 流中的streambuf来检测结束。)