gpt4 book ai didi

c++ - 在堆上从二进制数组转换为多维数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:33 25 4
gpt4 key购买 nike

我目前正在使用二进制文件快速访问存储在多维数组中的自定义对象,这些数组作为对象数组保存到文件中。到目前为止,从文件中读取并没有太大的问题,因为我一直在将数组读取到堆栈上的相同对象数组中。它看起来像这样:

Foo foo[5][10];
ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)&foo, sizeof Foo);

我目前遇到的问题是我越来越多地存储大量数据,并且在创建本地对象数组时溢出了我的堆栈。那么解决方案似乎是在堆上创建本地对象数组,我不确定如何格式化它以便我可以直接从 char* 中转换它。这是我在堆上分配的方式:

Foo (*foo)[1000] = new Foo [500][1000];

但是,如果我想转换为整个数组,这似乎不是正确的格式。例如,如果我尝试执行以下操作,它不起作用:

ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)(*foo), (sizeof Foo * 500 * 1000)); //or below
infile.read((char*)(&foo), (sizeof Foo * 500 * 1000)); //or below
infile.read((char*)(foo), (sizeof Foo * 500 * 1000)); //or below

基本上,我不知道如何使用我在堆上分配的数组来构造它。任何人都可以提供任何指示(嘿)?

非常感谢,吉姆

最佳答案

在我看来,使用 C++ 机制分配/解除分配意义不大,因为您会通过读取完全覆盖数据。所以不要做 new/delete东西。你的 Actor (char*)实际上是 reinterpret_cast< char* > .为什么不直接使用 malloc尺寸是否正确?

typedef Foo largeFoo[500][1000];
largeFoo* data = reinterpret_cast< largeFoo* >(malloc(sizeof largeFoo));

然后阅读它(再次使用 reinterpret_cast )。为了方便起见,您可以将您的指针别名化为一个引用。

largeFoo& foo = *data;

因此您所有剩余的代码都可以与堆栈版本中的相同,只有一个 free你的指针在最后。

关于c++ - 在堆上从二进制数组转换为多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3200436/

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