Как сказано в документации, std::copy_n()
скопирует точно n
элементов. Он будет продолжать читать после конца последовательности, на которую ссылается итератор. Я не уверен, что стандарт говорит о istreambuf_iterator<>
, хотя. Это, вероятно, неопределенное поведение, но потоки, вероятно, произведут много копий eof()
после конца. Это может привести к большому количеству мусора, когда доступно менее 2048
байт.
В любом случае, если вы хотите надежно скопировать до n
элементов, вам нужно написать собственную функцию:
template<typename I1, typename I2, typename size_type>
I copy_upto_n ( I1 begin, I1 end, size_type n, I2 out )
{
for (size_type i=0; (i < n) && (begin != end); ++i)
{
*out++ = *begin++;
}
return out;
}
Некоторые люди могут использовать std::iterator_traits<>
вместо дополнительного параметра шаблона, чтобы принудительно использовать тот же тип расстояния, что и итератор.