Boost logo

Boost Users :

Subject: Re: [Boost-users] [boost-users] istream_iterator question
From: Max (more4less_at_[hidden])
Date: 2009-05-12 08:42:00


> > Hello,
> >
> > I don't know why the following code does not work as expected.
> > I hope the guru's here could lend me a hand.
> >
> > For a test data file:
> > 3
> > 1 2
> > 3 4
> > 5 6
> >
> > 2
> > 1.2 4.3 234.2
> > 3.5656 67.88 345.3
> > <eof>
> >
> > and 2 simple test helper class:
> >
> > struct a
> > { int i, j; };
> > std::istream& operator>>(std::istream& in, a & p)
> > { in >> p.i >> p.j; return in; }
> > std::ostream& operator<<(std::ostream& out, const a & p)
> > { out << p.i << " " << p.j; return out; }
> >
> > struct b
> > { float i, j, k; };
> > std::istream& operator>>(std::istream& in, b & p)
> > { in >> p.i >> p.j >> p.k; return in; }
> > std::ostream& operator<<(std::ostream& out, const b & p)
> > { out << p.i << " " << p.j << " " << p.k; return out; }
> [Snip]
> >
> > copy_n is defined as:
> >
> > template <class InputIterator, class Size, class OutputIterator>
> > OutputIterator copy_n( InputIterator first, InputIterator last,
> > Size n,
> > OutputIterator result)
> > {
> > // copies the first `n' items from `first' to `result'. Returns
> > // the value of `result' after inserting the `n' items.
> > // it ends before n iterations, if the last iterator is reached
> > while( n-- && first != last)
> > {
> > *result = *first;
> > ++first;
> > ++result;
> > }
> > return result;
> > }
>
> Change your copy_n() as follows:
>
> template <class InputIterator, class Size, class OutputIterator>
> OutputIterator copy_n( InputIterator first, InputIterator last,
> Size n,
> OutputIterator result)
> {
> // copies the first `n' items from `first' to `result'. Returns
> // the value of `result' after inserting the `n' items.
> // it ends before n iterations, if the last iterator is reached
> while( n-- && first != last)
> {
> *result = *first;
> if (n) ++first;
> ++result;
> }
> return result;
> }
>
> Regards,
> Dmitry

Hello Dmitry,

I really appreciate your help on such a naive question!
I'm prepared to getting no response from the list, for my
message is really a little bit lengthy, and somewhat off
the main stream of the list, I'm afraid. :-)

With your code change, the test code runs as expected,
so does my real program. But I just don't know why.

In fact, the copy_n function is a safe version of another
one:

template <class InputIterator, class Size, class OutputIterator>
        OutputIterator copy_n( InputIterator first,
        Size n,
        OutputIterator result)
{
        // copies the first `n' items from `first' to `result'. Returns
        // the value of `result' after inserting the `n' items.
        while( n-- )
        {
                *result = *first;
                ++first;
                ++result;
        }
        return result;
}

I cannot find bug from it, and I think the safer one is also
straightforward and correct. :-)

I think 'first' and 'result' should both increment with 1 if needed
to keep sync. With your extra 'if(n)' condition they will be out of sync.
But that is just working well. I'm really confused.

Thanks again for your help.

B/Rgds
Max


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net