Search code examples
c++stliteratoristream

istream_iterator: taking extra input


I can't get this blasted thing working right. The problem is, If I want to enter 2 numbers, I actually have to enter 3. What is wrong?

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;
}

Solution

  • Change your stream iterator loop to:

        for(size_t szI = 0; (szI < szCount); ++szI)
        {   
            *oitBegin = *iitBegin;
            if (szI < szCount - 1)
            {
              ++oitBegin;
              ++iitBegin;
            }
        }