我有一个带有日志行的日志文件。每行由时间戳和消息组成。
timestamp1 blablabla
timestamp2 foo
timestamp3 bar
etc...
我的班级LogFile
有一个地图作为成员,以将每个时间戳与 ifstream 位置相匹配。
现在我想在这些时间戳上创建一个自定义迭代器。
例子 :
LogFile myFile("file.log");
for (LogFile::iterator it = myFile.begin(); it != myFile.end(); it++)
std::cout << it->message << std::endl;
输出 :
blablabla
foo
bar
我还希望迭代器能够递减。
现在我真的不知道如何以有效的方式实现它。
最简单的方法是使用每个迭代器增量打开-查找-读取-关闭文件。但这有效吗?我读到打开/搜索/关闭非常昂贵。
也许更好的解决方案是有一个LogFile::open()
方法来打开文件,让它保持打开状态来做我们想要的所有增量,最后用一个LogFile::close()
方法关闭文件。
你对此有什么建议吗?我敢肯定这不是第一次有人必须处理这种问题。
编辑更多细节:
我的类 LogFile 有一个类型的成员,std::map<Time, std::streampos>
用于存储时间戳和流位置之间的链接。
我需要增加和减少迭代器。因此我认为地图会更合适,因为我会使用the std::map::find(Time)
很多(复杂度 o(log(n)),而不是std::vector::find(Time)
ao(n) 复杂度)。
日志文件非常大(~20Mo),我的应用程序必须在资源有限的嵌入式系统上运行。所以我不能将整个文件存储在内存中,我必须在给定的时间缓冲并只获取我需要的部分。
所以是的,我想我会处理“open() and close() once”方法。
在增量的情况下,我不需要std::ifstream::seekg()
很多。但是在递减的情况下,我看不到另一种方法来寻找每个时间戳。这真的是最好的方法吗?