
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; } Here is version 1, quite trivial and works just ok. std::ifstream is("./test.txt") int n; is >> n; std::cout << "n=" << n << "\n"; for(int i=0; i<n; i++) { a tmp; is >> tmp; va.push_back(tmp); } std::copy(va.begin(), va.end(), std::ostream_iterator<a>(std::cout, "\n")); is >> n; std::cout << "n=" << n << "\n"; for(int i=0; i<n; i++) { b tmp; is >> tmp; vb.push_back(tmp); } std::copy(vb.begin(), vb.end(), std::ostream_iterator<b>(std::cout, "\n")); The output is: n=3 1 2 3 4 5 6 n=2 1.2 4.3 234.2 3.5656 67.88 345.3 With version 2 using istream_iterator, the behavior is strange: is >> n; std::cout << "n=" << n << "\n"; std::copy_n(std::istream_iterator<a>(is), std::istream_iterator<a>(), n, std::back_inserter(va)); std::copy(va.begin(), va.end(), std::ostream_iterator<a>(std::cout, "\n")); is >> n; std::cout << "n=" << n << "\n"; std::copy_n(std::istream_iterator<b>(is), std::istream_iterator<b>(), n, std::back_inserter(vb)); std::copy(vb.begin(), vb.end(), std::ostream_iterator<b>(std::cout, "\n")); 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; } The output is now: n=3 1 2 3 4 5 6 n=3 I've checked the code for several times and just not found the answer. I'm using VS2008SP1 on WinXP/SP1 Thanks for your help. B/Rgds Max