我正在阅读Constructing a vector with istream_iterators,这是关于将完整的文件内容读入字符向量中。虽然我希望将文件的一部分加载到字符向量中。
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
ifstream ifs(argv[1], ios::binary);
istreambuf_iterator<char> beginItr(ifs);
istreambuf_iterator<char> endItr(beginItr);
advance(endItr, 4);
vector<char> data(beginItr, endItr);
for_each(data.cbegin(), data.cend(), [](char ch)
{
cout << ch << endl;
});
}
这不起作用,因为提前不起作用,而上述问题的接受答案有效。为什么istreambuf_iterator
上的预先工作没有?
另外
endItr++;
endItr++;
endItr++;
endItr++;
cout << distance(beginItr, endItr) << endl;
返回0.请有人解释发生了什么!
答案 0 :(得分:10)
为什么istreambuf_iterator没有提前工作?
有效。它推进了迭代器。问题是istreambuf_iterator
是输入迭代器而不是前向迭代器,这意味着它是单通道迭代器:一旦你推进它,你就永远不会再次访问以前的状态。要做你想做的事,你可以简单地使用一个老式的for循环,数量为4。
答案 1 :(得分:2)
istreambuf_iterator
从basic_streambuf
读取后续的字节。它不支持定位(basic_istream::seekg
和basic_istream::tellg
)。
这是因为它是单通道输入迭代器,而不是前向迭代器或随机访问迭代器;它被设计为能够处理不支持定位的流(例如管道或TCP套接字)。
您可能会发现bidirectional iterator over file/ifstream中的某些解决方案很有用。
答案 2 :(得分:0)
如果有其他人遇到这个问题,并想要一些替代的简单代码,你可以尝试这样的事情:
std::vector<char> buffer{4};
std::ifstream source{argv[1], std::ios_base::binary};
source.read(buffer.data(), buffer.size());