摘要&我的理解:
我的问题可以参考"使用istream_iterator两次使用相同的ifstream",这不是一个好主意,因为在第一次遍历之后,流已经到达(文件结束) 。因为我们使用istream_iterator
来遍历整个流:
istream_iterator
是单遍迭代器,所以我们无法继续
返回重新加载流。感谢那些回答我问题的人!
====================
更新
我刚做了一些样本测试:
ifstream
个对象,结果是正确的。istream_iterator
绑定到相同的ifstream
obejct,结果不正确;而不是文件中的任何内容,我在那里得到了数字2
。就像@aschepler在下面的回答一样,istream_iterator
是一个单通道迭代器,在自我增量后会无效;但是一个全新的迭代器如何仍然不适用于此?为什么我必须创建两个不同的ifstream
对象才能使程序运行?
感谢您的回答!
===================原始问题这里========================= =
我有一个关于C ++引物5(p.407)的练习10.33的问题。我的问题发生在这一部分:
使用ostream_iterators,将奇数写入第一个输出文件,并将偶数写入第二个文件。
这里有一些定义:
ifstream ifs(argv[1]);
istream_iterator<int> int_in(ifs);
istream_iterator<int> int_in_eof;
ofstream ofs_odd(argv[2]);
ofstream ofs_even(argv[3]);
ostream_iterator<int> int_out_odd(ofs_odd, " ");
ostream_iterator<int> int_out_even(ofs_even, " ");
实际上std :: for_each做得很好:
for_each(int_in, int_in_eof, [&int_out_odd, &int_out_even](const int i)
{ *(i & 0X1 ? int_out_odd : int_out_even)++ = i; });
正确的结果如下所示:
input file: 1 2 3 4 5 6 7 8 9
output_odd: 1 3 5 6 9
output_even: 2 4 6 8
然后我尝试使用copy_if来实现:
//copy odd number to odd file
copy_if(int_in, int_in_eof, int_out_odd, [](const int i)
{return i & 0X1; });
//copy even number to even file
copy_if(int_in, int_in_eof, int_out_even, [](const int i)
{return !(i & 0X1); });
结果如下:
input file: 1 2 3 4 5 6 7 8 9
output_odd: 1 3 5 6 9
output_even:
我甚至没有内容。
我的问题是第一个copy_if更改了istream中的任何内容?
提前感谢您的帮助!
答案 0 :(得分:0)
istream_iterator
是单通道迭代器,而不是ForwardIterator。执行++iter
后,iter
的旧副本无效。