c++ - 从二进制文件中读取结构中动态分配的数组

标签 c++ arrays

我有一个结构。我想在这个结构中有一个数组,然后将其写入二进制文件,然后读取它。但是这个数组应该是动态分配的。我不确定我应该如何处理这个问题。我目前的猜测是:

我这样定义结构,然后将其写入文件:

struct map {
    int *tiles;
};

int main() {

    map sample;

    sample.tiles = new int[2];

    sample.tiles[0]=1;
    sample.tiles[1]=2;

    ofstream file("sample.data", ios::binary);

    file.write((char *)&sample, sizeof(sample));

    file.close();

    return 0;
}

然后在另一个程序中这样读:

map test;
ifstream file("sample.data", ios::binary);
file.read((char *)&test, sizeof(test));

当我想检查结果时

cout << test.tiles[0];

我得到一个奇怪的大数字,但显然不是我最初写入文件的数字。

正确的做法是什么?如何在不知道数组大小的情况下读取数组?

最佳答案

file.write((char *)&sample, sizeof(sample));

这会将以下结构写入文件:

struct map {
    int *tiles;
};

也就是说,一个包含单个指针的结构。指针是内存中的地址。因此,您最终写入文件的是一个无意义的原始内存地址。

很明显,当它稍后被读回时,这绝对没有用。您没有将任何整数写入您的文件,只是它们在内存中的地址,在一个很久以前终止的程序中。

为了正确执行此操作,您需要:

  1. 记录 tiles 指针指向多少个 int-egers。

  2. fwrite() 不是结构本身,而是 tiles 指针指向的整数。

您还需要将此数组中有多少个整数写入文件。如果文件仅包含这些整数,则实际上不需要这样做,因为您可以简单地读取文件的全部内容。但是,如果您希望在文件中写入一些额外的数据,显然有必要在文件本身中记录写入数组的大小,以便在读取它们时可以计算出有多少个整数后退。最简单的方法是编写一个 int,首先是数组的大小,然后是数组本身的内容。并在回读所有内容时执行相反的过程。

关于c++ - 从二进制文件中读取结构中动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831009/

相关文章:

c++ - 管理 vector 中的实体

java - 将文本文件中给定的两个数组合并到第三个数组中

javascript - 为什么我的循环只运行一次?

C 动态指针数组分配。为什么我可以访问超出范围的元素?

C++类命名空间怪异

C++ 提升 :fiber - How can i interrupt a fiber or join waiting until a maximum time?

java - 如何用随机不可变值填充数组?

java - 如何将多个字符串格式化为数组格式

c++ - 从代码中添加作者、版本等信息

c++ - 使用 strcpy_s 复制字符串