std :: istreambuf_iterator与std :: ifstream一起“窥视”

问题描述

|| 在处理数据流时,我更喜欢根据模板和迭代器编写代码。通常,我需要在下一个字符处“窥视”。为了使代码能够处理非双向迭代器,我有一个片段,如下所示:
template <class I>
I next(I it) {
    return ++it;
}
显然,这将生成迭代器的副本,递增该副本并返回它。这往往工作得非常好……除非
std::istreambuf_iterator
std::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
换句话说,增加迭代器的一个副本会产生增加所有迭代器的净效果! 我意识到文件流迭代器有局限性,因为它们只能对与文件关联的读取缓冲区中的当前内容进行操作。因此,可能没有与我想要的完全匹配的解决方案。有什么方法可以做我想要的吗?     

解决方法

        嗯,它实际上并没有增加所有迭代器,而是消耗了流,最终产生了相同的效果。如果您想窥视,则需要在流本身AFAIK上进行。     ,        您在帖子标题中提到了“'窥视\'”。 std :: istream具有
peek()
方法。用它。     ,        流缓冲区迭代器是一遍迭代器。您不能向后移动,它也没有双向功能,例如
vector::iterator
string::iterator
等。无法创建独立于任何其他迭代器实例的文件流上运行的流迭代器的隔离副本。这是不可能的,因为无论是否复制,流迭代器始终在同一个流对象上工作。复制迭代器不会复制文件流。