如何解决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
等。无法创建独立于任何其他迭代器实例的文件流上运行的流迭代器的隔离副本。这是不可能的,因为无论是否复制,流迭代器始终在同一个流对象上工作。复制迭代器不会复制文件流。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。