文件输入流迭代器理解

3

我可能对istream_iterator或迭代器的理解还有欠缺,但这两个代码片段不应该产生相同的结果吗?

typedef vector<int>::iterator Itv;
vector<int> vec = {1,2,3,4,5,6,7,8,9};

Itv ev = vec.begin();
++ev;
++ev;
++ev;
for (Itv it = vec.begin(); it != ev; ++it){
    cout << *it;
}

输出:123

//data.txt contains: 1,2,3,4,5,6,7,8,9
typedef istream_iterator<char> Itf;
fstream file("data.txt");
Itf ef(file);
++ef;
++ef;
++ef;    
for (Itf it(file); it != ef; ++it){
    cout << *it;
}

不输出任何内容。


1
Itf it(file) 不等同于从流的开头开始。之前的迭代器读取操作已经将文件流位置向前移动了。 - David G
1
旁注:有一个名为 std::advance 的函数可以多次递增迭代器。 - Danvil
1个回答

3

输入流迭代器是单向迭代器,也就是说它们只能遍历一次,一旦它们被递增,它们的先前值就无法获取。当递增 std::istream_iterator<T> 时,它会将一个值提取到一个 T() 对象中并返回结果。因此,该值被丢弃后就无法重新获取。

您需要做的是将每个读取存储到一个向量中,并在之后打印出来。您还可以使用 std::ostream_iterator

std::ostream_iterator<char> out(std::cout);
Itf ef(file);

out = ++ef;
out = ++ef;
out = ++ef;

这也是等价的:
std::copy(ef, Itf(), out);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接