2

我正在阅读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。请有人解释发生了什么!

4

3 回答 3

10

为什么提前在 istreambuf_iterator 上不起作用?

有用。它推进迭代器。问题是 anistreambuf_iterator是一个输入迭代器,但不是一个前向迭代器,这意味着它是一个单程迭代器:一旦你推进它,你将永远无法再次访问之前的状态。要做你想做的事,你可以简单地使用一个计数为 4 的老式 for 循环。

于 2012-09-03T10:14:47.790 回答
2

istreambuf_iterator从 a 中读取连续字节basic_streambuf。它不支持定位(basic_istream::seekgbasic_istream::tellg)。

这是因为它是单通道输入迭代器,而不是前向迭代器或随机访问迭代器;它被设计为能够处理不支持定位的流(例如管道或 TCP 套接字)。

您可能会发现文件/ifstream 上的双向迭代器中的一些解决方案很有用。

于 2012-09-03T10:43:05.053 回答
0

如果其他人偶然发现了这个问题,并且想要一些替代的简单代码,你可以尝试这样的事情:

        std::vector<char> buffer{4};
        std::ifstream source{argv[1], std::ios_base::binary};
        source.read(buffer.data(), buffer.size());
于 2016-09-25T04:44:15.250 回答