gpt4 book ai didi

c++ - std::istreambuf_iterator "peek"与 std::ifstream

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:23 24 4
gpt4 key购买 nike

在处理数据流时,我更喜欢根据模板和迭代器来编写代码。我经常需要“偷看”下一个角色。为了使代码能够处理非双向迭代器,我有一个如下所示的片段:

template <class I>
I next(I it) {
return ++it;
}

显然,这会创建迭代器的拷贝,递增拷贝并返回它。这往往工作得很好......除非 std::istreambuf_iteratorstd::ifstream 上运行。例如,给定一个包含内容“ABCD”的文件“test.txt”,以及以下代码:

#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。

关于c++ - std::istreambuf_iterator "peek"与 std::ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com