2

在处理数据流时,我更喜欢根据模板和迭代器来编写代码。我经常需要“偷看”下一个角色。为了使代码能够处理非双向迭代器,我有一个如下所示的片段:

template <class I>
I next(I it) {
    return ++it;
}

显然,这会生成迭代器的副本,递增副本并返回它。这往往工作得很好......除非std::istreambuf_iteratorstd::ifstream. 例如,给定一个test.txt内容为“ ”的文件“ ABCD”,以及以下代码:

#include <fstream>
#include <iostream>

template <class I>
I next(I it) {
    return ++it;
}

int main() {
    std::ifstream file("test.txt", std::ios::binary);
    std::istreambuf_iterator<char> it(file);
    std::cout << *next(it) << std::endl;
    std::cout << *it << std::endl;
}

输出是:

$ ./test 
B
B

而不是我所希望的:

$ ./test 
B
A

换句话说,递增迭代器的一个副本,具有递增所有它们的净效果!

我意识到文件流迭代器的局限性在于它们只能对当前与文件关联的读取缓冲区中的内容进行操作。所以可能没有一个完全符合我想要的解决方案。有没有办法做我想做的事?

4

3 回答 3

2

好吧,它实际上并没有增加所有迭代器,而是消耗了流,这最终具有相同的效果。如果你想提前看,你需要在流本身上这样做,AFAIK。

于 2011-06-13T01:40:26.487 回答
0

您在帖子标题中提到了“窥视”。std::istream 有一个peek()方法。用它。

于 2011-06-13T01:37:42.260 回答
0

流缓冲区迭代器是一次性迭代器。您不能向后移动,并且它没有双向功能vector::iteratorstring::iterator仅举几例。无法创建独立于任何其他迭代器实例的文件流上运行的流迭代器的隔离副本。这是不可能的,因为流迭代器,无论是否复制,一直在同一个流对象上工作。复制迭代器不会复制文件流。

于 2014-01-21T22:19:07.743 回答