代码之家  ›  专栏  ›  技术社区  ›  nakiya

istream_迭代器:接受额外的输入

  •  3
  • nakiya  · 技术社区  · 14 年前

    我不能让这该死的东西正常工作。问题是,如果我想输入2个数字,我实际上必须输入3。怎么了?

    namespace MT
    {
        template<class IIT, class OIT>
        OIT copy_n(IIT iitBegin, size_t szCount, OIT oitBegin)
        {   
            for(size_t szI = 0; (szI < szCount); ++szI)
            {   
                *oitBegin++ = *iitBegin++;
            }   
    
            return oitBegin;
        }   
    };
    
    int main()
    {
        vector<int> vNumbers;
        vector<char> vOperators;
        int iNumCount = 0;
        int iNumOperators = 0;
    
        cout << "Enter number of number(s) :) :\n";
        cin >> iNumCount;
        cout << "Enter number of operator(s) :\n";
        cin >> iNumOperators;
    
        int iNumber;
        cout << "Enter the " << iNumCount << " number(s):\n";
        MT::copy_n(istream_iterator<int>(cin), iNumCount, back_inserter(vNumbers));
    
        char cOperator;
        cout << "\nEnter the " << iNumOperators << " operator(s):\n";
        MT::copy_n(istream_iterator<char>(cin), iNumOperators, back_inserter(vOperators));
    
        copy(vNumbers.begin(), vNumbers.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
        copy(vOperators.begin(), vOperators.end(), ostream_iterator<char>(cout, " "));
        cout << endl;
    
        return 0;
    }
    
    3 回复  |  直到 9 年前
        1
  •  3
  •   Nim    14 年前

    将流迭代器循环更改为:

        for(size_t szI = 0; (szI < szCount); ++szI)
        {   
            *oitBegin = *iitBegin;
            if (szI < szCount - 1)
            {
              ++oitBegin;
              ++iitBegin;
            }
        }   
    
        2
  •  2
  •   icecrime    14 年前

    问题是 istream_iterator

    • istream_迭代器 被构造
    • 当迭代器递增时,复制读取iNumCount附加值

    iiBegin++ 它读取一个被丢弃的值。在任何 经典的

    [编辑] 可能的解决方案:

    template<class IIT, class OIT>
    OIT copy_n(IIT iitBegin, size_t szCount, OIT oitBegin)
    {   
      *oitBegin++ = *iitBegin;
      for(size_t szI = 0; (szI < szCount - 1); ++szI)
        *oitBegin++ = *++iitBegin;
      return oitBegin;
    }
    
        3
  •  0
  •   Simone    14 年前

    我认为问题是你没有通过EOF符号。如果您在Linux下工作,请在插入第二个数字后尝试键入CTRL+D(在Windows下应该是CTRL+Z,但我不确定)。

    推荐文章