• 締切済み

動的に確保した配列のファイルへの書き出し

動的に確保した配列を、ファイルに書きだそうとしています。 int i, arraysize = 10; int **array; array = new int*[ arraysize ]; for (i = 0 ; i < arraysize ; i++) array[ i ] = new int [ arraysize ]; ofstream out("filename", ios::out | ios::binary); out.write((char *) array, sizeof( array )); これでは array のポインタが書き込まれるだけ、なのかな ? ということで、配列を書き込む目的を果たせておりません。このように動的に確保した多次元配列 (要素数は既知) をファイルに書き込むためにはどうすればよろしいでしょうか。

みんなの回答

  • anzu-k
  • ベストアンサー率66% (2/3)
回答No.5

油断してました。ANo.4の最終行 array[0][arraysize] は array[0][arraysize-1] です。 質問のような配列の場合はarray[0][arraysize-1]とarray[1][0]は不連続です。

  • anzu-k
  • ベストアンサー率66% (2/3)
回答No.4

ANo.1、ANo.2の修正ですが、 質問内容の >out.write((char *) array, sizeof( array )); の行を for ( int i = 0; i < arraysize; i++ ) { out.write( (char*)array[i], arraysize*sizeof(**array) ); } としてはどうでしょうか。 TacosanさんのANo.2は結果的に大丈夫そうですが、 array[i]はint*型なので、 たまたまポインタ(アドレス)型とint型のサイズ(バイト数)が、 一致しているだけなような気がします。 例えば out.write( array[i], arraysize*sizeof(int) ); out.write( array[i], arraysize*sizeof(**array) ); out.write( array[i], arraysize*sizeof(*array[i]) ); ちなみに配列の不連続についてですが、 arraysize長の配列をarraysize個だけ動的に割り当てているだけなので、 array[0]配列とarray[1]配列との間の連続性は保障されません。 array[0][0]とarray[0][1]・・・array[0][arraysize]は連続したものとして扱えます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>また、配列に動的確保した領域は必ずしも連続した領域ではありません >int nn = array[1] - array[0]; >とした場合 nnがarraysizeにはならない場合があるでしょう 本当でしょうか。 仮に、動的に確保した領域(配列とは別物)が連続していない(飛び飛び)とします。 このとき、例えば、当該領域を指すポインターをインクリメントしていくうちに、 確保していない領域を指すおそれがありますね。飛び飛びだから。 そういう状況を引き起こすのは、いささかまずいのではないでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

out.write( array[i], arraysize ); じゃなくて out.write(array[i], arraysize*sizeof array[i]); かな>#1. 多分 sizeof array[i] を掛けないとまずいと思う.

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

out.write((char *) array, sizeof( array )); この状態では 書き込むのは 4バイトだろうと思います # char*のサイズは環境依存だったように思います また、配列に動的確保した領域は必ずしも連続した領域ではありません int nn = array[1] - array[0]; とした場合 nnがarraysizeにはならない場合があるでしょう out.write((char *) array, sizeof( array )); の状態では array[0]の内容 つまり for (i = 0 ; i < arraysize ; i++) array[ i ] = new int [ arraysize ]; で確保したアドレスが書き出されるだけだと思います array[i][j]の中身を出力するなら for ( int i = 0; i < arraysize; i++ ) {   out.write( array[i], arraysize ); } といった具合でしょう または 確保を char* array; array = new char[ arraysize * arraysize ]; と確保して out.write( array, arraysize * arraysize ); なら一度で書き込めるでしょう