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