我有一个结构。我想在这个结构中有一个数组,然后将其写入二进制文件,然后读取它。但是,应该动态分配此数组。我不知道该怎么办呢。我目前的猜测是:
我定义然后将结构写入文件,如下所示:
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];
我得到了一个奇怪的数字,但显然不是我最初写入该文件的数字。
这样做的正确方法是什么?如何在不知道其大小的情况下读取数组?
答案 0 :(得分:3)
file.write((char *)&sample, sizeof(sample));
这会向文件写入以下结构:
struct map {
int *tiles;
};
即,包含单个指针的结构。指针是内存中的地址。所以,你最终写入文件的是一个无意义的原始内存地址。
显然,当它稍后被回读时,绝对没有用处。您没有在您的文件中写入任何整数,只是它们在内存中的地址,在很久以前终止的程序中。
为了正确执行此操作,您需要:
记录int
指针指向的tiles
- 的数量。
fwrite()
不是结构本身,而是tiles
指针所指向的整数。
您还需要在文件中写入此数组中有多少个整数。如果文件只包含这些整数,则不需要这样做,因为您只需读取文件的全部内容即可。但是,如果你希望在文件中写一些额外的数据,显然有必要在文件本身中记录写入数组的大小,以便在读取它们时可以弄清楚它有多少个整数。背部。最简单的方法是首先编写一个int
,即数组的大小,然后是数组本身的内容。在阅读所有内容时,请执行相反的过程。
答案 1 :(得分:1)
您的sample
对象包含指针tiles
,它是您正在写入文件的指针值。你要写的是指针指向的内容。
在您的示例中,您要执行file.write(sample.tiles, 2*sizeof(*sample.tiles));
。这是2*
,因为你做过new int[2]
。一般情况下,您还希望在文件中保存大小(本例中为2),以便您知道要读回多少个整数。在这种简单的情况下,您可以根据文件的大小推断出2。