我计划编写一个程序,该程序必须以读/写方式多次访问某个文件。 所以我决定使用 fstream,因为我可以使用这个类来进行阅读和写作。
我的想法是在应用程序启动时打开文件,然后在应用程序关闭时关闭它。
由于文件可以任意大,我打算使用“分页”结构,其中:
1)为每个页面预分配固定数量的内存和固定数量的页面
2) 将部分文件加载到第一个空闲页面
3)如果没有空闲页面,我选择一个具有一定标准的非空页面,我提交其中的所有编辑(如果有的话),然后加载页面中的文件部分。
编码并不难。但我想知道我是否要重新发明轮子......也许 fstream 本身是以一种聪明的方式编写的,因此它也实现了类似的分页机制。既然如此,我就不管了,随时写,随时读。
有什么建议吗?
不要自己这样做。除非您使用非常奇特的实现,否则 fstream 类已经有效地实现了这种机制。
查看 http://www.cplusplus.com/doc/tutorial/files/“缓冲区和同步”
如果您使用旧内核或标准库的实现来
seek
进入大于2GB的文件,则可能会出现问题。检查这个
C++ 中的大文件支持
或使用 Boost.Filesystem
标准 C++ 库的内部工作因实现而异。因此,需要进行测试才能在您的首选平台上获取一些真实数据。一般来说,“内存映射文件”被认为是访问文件中存储的数据的最快方法(正如 Uflex 在他的评论中提到的那样,但它也有一些缺点(请参阅链接的 wiki 页面)。您可以使用标准(POSIX) C 函数 mmap()
和
munmap()
,或 Boost C++ 库,它还具有用于内存映射文件的可移植 C++ 接口。