文件istream迭代器的理解

时间:2014-04-09 20:58:30

标签: c++ iterator istream-iterator

我可能缺乏对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 个答案:

答案 0 :(得分:2)

输入流迭代器是单遍迭代器,这意味着一旦它们递增,就无法获得其先前的值。递增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);