使用std :: copy_if将数字写入文件,无法获得正确的结果

时间:2017-04-04 01:52:39

标签: c++

摘要&我的理解:

我的问题可以参考"使用istream_iterator两次使用相同的ifstream",这不是一个好主意,因为在第一次遍历之后,流已经到达(文件结束) 。因为我们使用istream_iterator来遍历整个流:

  1. 因为istream_iterator是单遍迭代器,所以我们无法继续 返回重新加载流。
  2. 因为流已经到达文件结尾,即使我们将新的迭代器绑定到它,迭代器仍然指向文件结尾。
  3. 感谢那些回答我问题的人!

    ====================

    更新

    我刚做了一些样本测试:

    1. 有两个不同的ifstream个对象,结果是正确的。
    2. 与两个不同的istream_iterator绑定到相同的ifstream obejct,结果不正确;而不是文件中的任何内容,我在那里得到了数字2
    3. 就像@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中的任何内容?

      提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

istream_iterator是单通道迭代器,而不是ForwardIterator。执行++iter后,iter的旧副本无效。