在处理数据流时,我更喜欢根据模板和迭代器来编写代码。我经常需要“偷看”下一个角色。为了使代码能够处理非双向迭代器,我有一个如下所示的片段:
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
换句话说,递增迭代器的一个副本,具有递增所有它们的净效果!
我意识到文件流迭代器的局限性在于它们只能对当前与文件关联的读取缓冲区中的内容进行操作。所以可能没有一个完全符合我想要的解决方案。有没有办法做我想做的事?