二进制I / O以二维动态数组文件

时间:2012-05-22 08:35:49

标签: c++ arrays serialization dynamic binary

我遇到了使用2维动态数组进行文件传输的I / O问题。它编译良好,但它不能按我的意愿工作。例如,我保存数字1的“地图”,然后我将源代码中的数字更改为示例5并编译它,现在我加载数字1的“地图”,但是当它在循环中写入结束时,输出是5而不是1.请有人帮忙修改代码吗?

#include <iostream>
#include <fstream>
int main()
{
int ** array;

array = new int*[20];
for(int y=0;y<20;y++)
    array[y] = new int[30];

for(int y=0;y < 20;y++)
    for(int x=0;x < 30;x++)
        array[y][x] = 1;

int volba = 1;
std::cin >> volba;

if(volba)
{
    std::ifstream in("map",std::ios::in | std::ios::binary);
    if(!in.is_open())
        std::cout << "in map open error\n";
    in.read((char*)&array, sizeof(array));
    in.close();
    std::cout << "loaded\n";
}
else
{
    std::ofstream out("map",std::ios::out | std::ios::binary);
    if(!out.is_open())
        std::cout << "out map open error\n";
    out.write((char*)&array, sizeof(array));
    out.close();
    std::cout << "saved\n";
}

std::cout << "array\n";
for(int y=0;y < 20;y++)
{
    for(int x=0;x < 30;x++)
        std::cout << array[y][x] << " ";
    std::cout << std::endl;
}

for(int y=0;y<20;y++)
    delete [] array[y];
delete [] array;

return 0;
}

2 个答案:

答案 0 :(得分:1)

主要问题是:Hereby

array = new int*[20];

你分配了一个指针数组,这不会像你以后那样成为二维数组:

array[y] = new int[30];

请注意,此

之间存在差异
// array of pointers to integer arrays
int ** array = new int*[20];
for(int y=0;y<20;y++)
  array[y] = new int[30];

和这个

// two dimensional integer array
int array[20][30];

您不能假设您的数组数组将位于连续的内存中。


此外: 特此

out.write((char*)&array, sizeof(array));

你只是写出指针,而不是实际的数据。尝试打印sizeof(array)

#include <iostream>

int main() {
  int * array = new int[10];
  std::cout << sizeof(array) << std::endl; // probably prints 4 or 8
  return 0;
}

结论:除非您需要将其用于教育目的,否则std::vector将更方便地免费为您提供内存管理。另请查看Boost Serialization。它提供了STL集合序列化的功能。

答案 1 :(得分:0)

错误在于sizeof(array)等于指针的大小,而不是动态分配的内存的大小。因此,您只能读/写4(或8)个字节。使用实际数组大小(在本例中为20*30)而不是sizeof(array)