gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:48:11 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com