有什么办法可以用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_iterator
或 std::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.
我正在这样写我的文件:
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_iterator
或 std::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.