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
换句话说,增加迭代器的一个副本会产生增加所有迭代器的净效果!
我意识到文件流迭代器有局限性,因为它们只能对与文件关联的读取缓冲区中的当前内容进行操作。因此,可能没有与我想要的完全匹配的解决方案。有什么方法可以做我想要的吗?
没有找到相关结果
已邀请:
3 个回复
抵浮细
渴翅吮斡撤
方法。用它。
伞腹
和
等。无法创建独立于任何其他迭代器实例的文件流上运行的流迭代器的隔离副本。这是不可能的,因为无论是否复制,流迭代器始终在同一个流对象上工作。复制迭代器不会复制文件流。