2012-05-22 55 views
0

使用二维动态数组传输I/O时遇到问题。它编译好,但它不工作,因为我想。例如,我保存了数字1的“映射”,之后我将源代码中的数字更改为示例5并编译它,现在我加载数字1的“映射”,但是在循环中写入数据1时,输出是5不是1.请有人可以帮助修复代码?使用二维动态数组进行文件传输的二进制I/O

#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; 
} 

回答

1

的主要问题是:在此

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

+0

那么你推荐我什么? – c0ntrol

+0

@ user1295618 - 我用粗体表示了一个选项。你也可以使用一个静态的二维'数组[20] [30]'。 – moooeeeep

+0

是的,但它不是好的编程方式,不是吗? :| – c0ntrol

0

的错误是在sizeof(array)等于一个指针,不动态分配的存储器的尺寸的尺寸的事实。作为一种效果,您只能读/写4(或8)个字节。使用实际的数组大小(在这种情况下为20*30)而不是sizeof(array)

+0

我试图将sizeof(array)更改为sizeof(int)* 600,但我仍然存在这个问题:“例如,我保存数字1的”map“,然后将源代码中的数字更改为示例5并编译它,现在我加载我的数字1的“地图”,但是当它在循环中写入到最后时,输出是5而不是1。 – c0ntrol

+0

代码中存在另一个问题,请参阅@moooeeeep的答案。 –