2015-05-27 2 views
2

Я пишу мои файлы, как это:Есть ли способ использовать istreambuf_iterator для чтения определенной длины?

std::ofstream os; // declared somewhere earlier 
std::vector<char> vec; // declared somewhere earlier 

std::ostreambuf_iterator<char> oi(os); 
std::copy(vec.begin(), vec.end(), oi); 

Так naturaly мне было интересно, есть ли подобный способ читать, скажем, 5 байт, используя std::istream_iterator или std::istreambuf_iterator, однако, так как они не поддерживают operator+ Я не могу понять, как это сделать.

Например, я вообразил soludion близко к этому:

std::istream_iterator<char> ii(file); 
std::copy(ii, ii + 5, vec.begin()); 

Есть ли способ сделать это в C++ 14?

PS: Я хочу решение с использованием STL, поэтому использование boost не является вариантом.

ответ

3

Вы можете использовать std::copy_n вместо std::copy.

std::copy_n(ii, 5, vec.begin()); 

Однако, это немного небезопасно, так как он будет продолжать пытаться читать, даже если поток будет исчерпан. Если это вас беспокоит, вам придется либо использовать конструкцию нижнего уровня, как базовую для цикла, либо библиотеку с более продвинутыми возможностями обработки диапазона, например, отличную от 0 до 030.

+0

ok, поэтому, если я правильно его получу, функция будет блокироваться, если не хватает байтов для чтения? Любопытно, что у моего потока будет гарантированное количество байтов, так что это не проблема. – tofiffe

+0

@tofiffe: Нет, он не будет блокироваться. Он просто заполнит оставшиеся символы мусором. (на самом деле, я считаю, что он будет просто повторять последний успешно прочитанный персонаж снова и снова, хотя я не уверен, что это гарантировано). –

+0

приятный, кажется, что это гораздо полезнее, чем я ожидал: D – tofiffe

 Смежные вопросы

  • Нет связанных вопросов^_^