0

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

2 に答える 2

1

主な問題は次のとおりです。

array = new int*[20];

ポインターの配列を割り当てますが、これは後で行うように 2 次元配列にはなりません。

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 コレクションのシリアル化機能を提供します。

于 2012-05-22T08:48:34.713 に答える
0

エラーは、動的に割り当てられたメモリのサイズではなく、ポインターsizeof(array)のサイズに等しいという事実にあります。結果として、4 (または 8) バイトのみを読み書きします。の代わりに実際の配列サイズ (この場合は ) を使用します。20*30sizeof(array)

于 2012-05-22T08:41:12.710 に答える