我有一个非常大的一维数组,其中包含我的游戏的 Tile 值。每个值都是一个 4 位数字,代表一种地 block 类型(泥土、草地、空气)。
我像这样使用 fstream 将这些值保存在一个文件中:
std::fstream save("game_save", std::fstream::out | std::fstream::in);
假设我有一张小 map 。 3 格宽和 3 格高,全是泥土(泥土值为 0001)。
在游戏中它看起来像
0001 0001 0001
0001 0001 0001
0001 0001 0001
在文件中它看起来像(只是一维)
0001 0001 0001 0001 0001 0001 0001 0001 0001
如果我想转到第 5 个值(第 2 行第 2 列)并仅将该值更改为 0002,我该怎么办?这样当我再次运行游戏并读取它看到的文件时:
0001 0001 0001 0001 0002 0001 0001 0001
任何关于如何做到这一点的建议将不胜感激
最佳答案
如果您完全确定每个元素的 4 位数字 + 恰好 1 个空格并且文件中没有制表符或换行符出现,您可以使用 seekp(n*5,ios_base::beg)
将您的下一篇文章定位在第 n 个元素上并覆盖它。
建议
如果用 ios::binary
模式打开文件,使用这种定位更安全。
在这种情况下,您还可以考虑使用 block 函数 read()
/write()
和使用 n 来读取/写入二进制数据*sizeof(tile)
找到正确的位置。该文件不再完全独立于平台,并且无法使用文本编辑器手动编辑它,但是您会提高性能,尤其是在地形非常大的情况下,如果您经常访问同一条线。
关于C++仅覆盖文件段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31485434/