C++仅覆盖文件段

标签 c++ 2d fstream tiles overwrite

我有一个非常大的一维数组,其中包含我的游戏的 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/

相关文章:

java - 如何让这个二维数组向右旋转 90 度?

c++ - 读取文件 ".txt"并将每一行的数据分配给循环列表中的新节点 C++

c++ - 从 TVector2 类 : "No matching function for call to Complex::Complex()" 派生复杂类

C++在构造函数中调用虚方法

c++ - 可变参数模板的链接器错误

java - 二维数组中的寻路

c++ - 模板成员函数无法自动推断类型

java - Swing - Awt。如何在没有前一帧中的元素的情况下渲染新帧?

c++ - 当底层文件取消链接时,fstream 对象会发生什么?

c++ - 尝试使用 ostream 保存文件内容时出错