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

时间:2016-11-27 16:13:50

标签: 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];

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

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

2 个答案:

答案 0 :(得分:3)

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

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

struct map {
    int *tiles;
};

即,包含单个指针的结构。指针是内存中的地址。所以,你最终写入文件的是一个无意义的原始内存地址。

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

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

  1. 记录int指针指向的tiles - 的数量。

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

  3. 您还需要在文件中写入此数组中有多少个整数。如果文件只包含这些整数,则不需要这样做,因为您只需读取文件的全部内容即可。但是,如果你希望在文件中写一些额外的数据,显然有必要在文件本身中记录写入数组的大小,以便在读取它们时可以弄清楚它有多少个整数。背部。最简单的方法是首先编写一个int,即数组的大小,然后是数组本身的内容。在阅读所有内容时,请执行相反的过程。

答案 1 :(得分:1)

您的sample对象包含指针tiles,它是您正在写入文件的指针值。你要写的是指针指向的内容。 在您的示例中,您要执行file.write(sample.tiles, 2*sizeof(*sample.tiles));。这是2*,因为你做过new int[2]。一般情况下,您还希望在文件中保存大小(本例中为2),以便您知道要读回多少个整数。在这种简单的情况下,您可以根据文件的大小推断出2。