我希望这是一个简单的问题,有人可以回答我或给我一个例子。我正在处理大小超过4GB的文件,如果我想存储我的整个输入文件然后输出它,我预见到内存问题,所以我认为在我去的时候考虑重写文件会更容易(逐行或更可能一次25行的部分)。当我调查它虽然看起来比我原先想象的更复杂,并且到处(包括这个网站)人们建议存储数据或打开单独的输出文件。您可以在阅读时编辑文件吗?如果是这样,最好的方法是什么?我是否应该尝试使用文件的npos返回读入内容?
文件格式(没有标题和无关信息):
*体素0 0 0 1 1 1 3
Res 000000000000 000100000000 2.66668e + 06
Cap 000000000000 000100000000 2.19141e-16
Res 000000010000 000100010000 2.66668e + 06
Cap 000000010000 000100010000 2.19141e-16
Res 000000000001 000100000001 2.66668e + 06
Cap 000000000001 000100000001 2.19141e-16
Res 000000010001 000100010001 2.66668e + 06
Cap 000000010001 000100010001 2.19141e-16
Res 000000000000 000000010000 2.66668e + 06
Cap 000000000000 000000010000 2.19141e-16
Res 000100000000 000100010000 2.66668e + 06
Cap 000100000000 000100010000 2.19141e-16
Res 000000000001 000000010001 2.66668e + 06
Cap 000000000001 000000010001 2.19141e-16
Res 000100000001 000100010001 2.66668e + 06
Cap 000100000001 000100010001 2.19141e-16
Res 000000000000 000000000001 2.66668e + 06
Cap 000000000000 000000000001 2.19141e-16
Res 000100000000 000100000001 2.66668e + 06
Cap 000100000000 000100000001 2.19141e-16
Res 000000010000 000000010001 2.66668e + 06
Cap 000000010000 000000010001 2.19141e-16
Res 000100010000 000100010001 2.66668e + 06
第000100010000 000100010001号2.19141e-16
基于来自另一个文件的信息和文件顶部的位置(0 0 0 1 1 1),确定更改的方式和值,但在谈论成千上万时,我真的很担心我无法读取然后写入新文件的数据块,我不知道如何有效地读取和写入此文件。唯一应该改变的是每一行末尾的值(2.6668e + 06和2.19141e-16),尽管它们会有所不同,但在这种情况下它们都是相同的,以便于理解。我目前正在阅读文件(仅限ifstream),并且可以达到我需要重写文件但不知道如何轻松更改我写作位置的位置,也不知道如何插入而只是插入和其他写入现有文件的类似问题。
任何建议都值得赞赏,简短的例子尤其如此!
答案 0 :(得分:1)
如果您要修改的记录对于“新”和“旧”数据的大小始终相同,则重写到同一文件中没有问题 - 如果您要写入不同长度的数据,这只是一个问题而不是你的“旧”数据。
只需使用fstream f("somename.ext", ios::out|ios::in)
打开文件,然后根据需要使用f.seekg()
和f.seekp()
转到文件中的相关位置(您可以使用tellp
和{{ 1}}找出你目前的位置
答案 1 :(得分:1)
为了扩展Mats Petersson所说的内容,对于文件大小和类似大小的写入,内存映射文件将为您提供良好的服务 - 特别是对于您所描述的文件大小。否则,你的下一个最好的选择是缓冲列表方案,它不一定要复杂得多。