我有一个结构。我想在这个结构中有一个数组,然后将其写入二进制文件,然后读取它。但是这个数组应该是动态分配的。我不确定我应该如何处理这个问题。我目前的猜测是:
我这样定义结构,然后将其写入文件:
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;
};
也就是说,一个包含单个指针的结构。指针是内存中的地址。因此,您最终写入文件的是一个无意义的原始内存地址。
很明显,当它稍后被读回时,这绝对没有用。您没有将任何整数写入您的文件,只是它们在内存中的地址,在一个很久以前终止的程序中。
为了正确执行此操作,您需要:
记录
tiles
指针指向多少个int
-egers。fwrite()
不是结构本身,而是tiles
指针指向的整数。
您还需要将此数组中有多少个整数写入文件。如果文件仅包含这些整数,则实际上不需要这样做,因为您可以简单地读取文件的全部内容。但是,如果您希望在文件中写入一些额外的数据,显然有必要在文件本身中记录写入数组的大小,以便在读取它们时可以计算出有多少个整数后退。最简单的方法是编写一个 int
,首先是数组的大小,然后是数组本身的内容。并在回读所有内容时执行相反的过程。
关于c++ - 从二进制文件中读取结构中动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831009/