0

我希望这是一个简单的问题,有人可以为我回答或给我一个例子。我正在处理大小超过 4GB 的文件,如果我想存储我的整个输入文件编辑它然后输出它,我预见到内存问题,所以我认为在我去的时候重写文件会更容易(逐行或更可能是一次 25 行的部分)。当我研究它时,它似乎比我最初想象的要复杂得多,而且在任何地方(包括这个站点)人们都建议存储数据或打开一个单独的输出文件。是否可以在读取文件时对其进行编辑?如果是这样,最好的方法是什么?我应该尝试使用文件的 npos 来返回读取的内容吗?

文件格式(无标题和无关信息):

* voxel 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
帽 000000000001 000000010001 2.19141e-16
水库 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)并且可以到达我需要重写文件但不知道如何轻松更改我正在写入的位置的位置,也不知道如何插入与仅插入和其他写入现有文件的类似问题。

任何建议都值得赞赏,特别是简短的例子!

4

2 回答 2

1

如果您正在修改的记录对于“新”和“旧”数据的大小始终相同,那么重写到同一个文件中没有问题 - 如果您要写入的数据长度与您的“旧”数据。

只需使用 , 打开文件fstream f("somename.ext", ios::out|ios::in),并根据需要使用f.seekg()f.seekp()转到文件中的相关位置(您可以使用tellptellg找出您当前所在的位置)

于 2013-09-12T22:33:44.963 回答
1

为了扩展 Mats Petersson 所说的内容,对于大小相同的文件以及类似大小的写入,内存映射文件将为您提供很好的服务——尤其是您所描述的文件大小。否则,您的下一个最佳选择将是缓冲区列表方案,它不一定要复杂得多。

于 2013-09-12T22:44:14.517 回答