有什么办法可以用istreambuf_iterator来读取特定的长度吗?

Is there any way to use istreambuf_iterator to read a specific length?

我正在这样写我的文件:

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);

所以我很自然地想知道是否有类似的方式来读取比方说使用 std::istream_iteratorstd::istreambuf_iterator 的 5 个字节,但是因为它们不支持 operator+ 我似乎无法弄清楚如何完成此操作。

例如我想象的解决方案接近于此:

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

有没有办法在 C++14 中做到这一点?

PS:我想要一个使用 STL 的解决方案,所以使用 boost 不是一个选项。

您可以使用 std::copy_n 而不是 std::copy

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

但是,这有点不安全,因为即使流已耗尽,它也会继续尝试读取。如果您担心这一点,那么您将不得不使用像基本 for 循环这样的较低级别的构造,或者使用具有更高级范围处理功能的库,例如 Eric Niebler 的出色 range library.