【问题标题】:Binary I/O to file with 2 dimensional dynamic array二进制 I/O 到带有二维动态数组的文件
【发布时间】:2012-05-28 17:38:52
【问题描述】:

我在使用 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;
}

【问题讨论】:

    标签: c++ arrays serialization dynamic binary


    【解决方案1】:

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

    【讨论】:

    • 我试图将 sizeof(array) 更改为 sizeof(int) * 600 但我仍然遇到这个问题:“例如,我保存数字 1 的“映射”,然后我在源代码中更改数字到示例 5 并编译它,现在我加载数字 1 的“映射”,但是当它在最后循环写入时,输出是 5 而不是 1。”
    • 你的代码还有问题,看@moooeeeep的回答。
    【解决方案2】:

    主要问题是这样的:特此

    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 集合进行序列化的功能。

    【讨论】:

    • @user1295618 - 我用粗体显示了一个选项。您也可以使用静态二维array[20][30]。
    • @user1295618 - 当然不是。好的编程方法是使用std::vector 并可能使用 Boost Serialization。
    猜你喜欢
    • 2012-05-05
    • 2016-06-15
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多