std::istreambuf_iterator<char> first( _file );
std::istreambuf_iterator<char> last( _file );
std::advance( last, _size );
istreambuf_iterators - это итераторы ввода.Когда вы продвигаетесь последним, другой итератор также изменяется. Вы рассматриваете их как прямые итераторы, у которых есть свойство, что вы можете скопировать итератор, продвинуть его, а затем получить идентичную последовательность, продвигая копию.
Для общего случая:
template<class InIter, class Size, class OutIter>
void copy_n(InIter begin, InIter end, Size n, OutIter dest) {
for (; begin != end && n > 0; ++begin, --n) {
*dest++ = *begin;
}
}
//...
std::string ReadPartial(std::istream& file, int size) {
std::string result;
copy_n(istreambuf_iterator<char>(file), istreambuf_iterator<char>(),
size, back_inserter(result));
return result;
}
Однако в этом случае вам лучше изменить размер строки, используя istream :: read непосредственно в & result [0], и, наконец, проверитьчто вы прочитали нужное количество символов.