C言語関係掲示板

過去ログ

No700 動的に3次元配列を作ってファイルに書き込む

[戻る] [ホームページ]
No.8255

うまくファイルに書けない
投稿者---ともひろ(2003/07/10 23:16:43)


動的に3次元配列を作ってその配列をfwriteでファイルに書き込みたいです。しかし、うまく書き込めません。プログラムは簡単にこんな感じ。

int j,k;
double ***p;  //p[4][3][2]にする
FILE *fp;

p = (double ***)malloc(sizeof(double **) * 4);
for(k = 0; k < 4; k++){
   p[k] = (double **)malloc(sizeof(double *) * 3);
   for(j = 0; j < 3; j++){
      p[k][j] = (double *)malloc(sizeof(double) * 2);
   }
}

//配列pにデータを格納

fwrite(p,sizeof(double),4 * 3 * 2,fp);


どこかおかしい所がわかったら教えて下さい。

No.8257

Re:うまくファイルに書けない
投稿者---こん!(2003/07/10 23:48:57)


>//配列pにデータを格納

>fwrite(p,sizeof(double),4 * 3 * 2,fp);

pがさしているのはmallocで確保したポインタ配列のアドレスです。そこにセッ
トしたデータ(アドレスの事ではなく)が連続で並んでいる訳ではありません。
唯一並んでいるとすればp[n][n]が指している要素数2個分ですね。

ポインタによる擬似配列のデータを書き出そうとすると2重ループでp[n][n]を
回しながら要素数2個ずつ書き出すしかないでしょう。


No.8258

Re:うまくファイルに書けない
投稿者---かずま(2003/07/10 23:49:54)


> fwrite(p,sizeof(double),4 * 3 * 2,fp);
> どこかおかしい所がわかったら教えて下さい。

p が指す領域は、ポインタが 4つだけ。16バイトかな。
それなのに、8*4*3*2 = 192バイト書こうとしているから、おかしい。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, j, k;
    double ***p, *d, v;  //p[4][3][2]にする
    FILE *fp = fopen("d.dat", "wb");

    d = malloc(sizeof(double) * 4 * 3 * 2);
    p = (double ***)malloc(sizeof(double **) * 4);
    for (i = 0; i < 4; i++){
       p[i] = (double **)malloc(sizeof(double *) * 3);
       for (j = 0; j < 3; j++)
          p[i][j] = d + (i*3 + j)*2;
    }

    for (i = 0; i < 4; i++)
        for (j = 0; j < 3; j++)
            for (k = 0; k < 2; k++)
                p[i][j][k] = i + j/10.0 + k/100.0;

    fwrite(&p[0][0][0], sizeof(double), 4 * 3 * 2, fp);
    fclose(fp);

    fp = fopen("d.dat", "rb");
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
            for (k = 0; k < 2; k++) {
                fread(&v, sizeof(double), 1, fp);
                printf("%10f", v);
            }
            printf("\n");
        }
        printf("\n");
    }
    fclose(fp);

    return 0;
}


No.8260

うまくファイルに書けない
投稿者---ともひろ(2003/07/11 00:02:29)


うまくできました。
こん!さん、かずまさん、ありがとうございました。

No.8261

Re:うまくファイルに書けない
投稿者---こん!(2003/07/11 00:16:40)


>          p[i][j] = d + (i*3 + j)*2;

おぅ、なるほどね。いつもながら鮮やか。

m(__)m


No.8263

Re:うまくファイルに書けない
投稿者---ともひろ(2003/07/11 00:22:43)


たびたびすいませんが、かずまさんのプログラムではdatファイルを作成
していますが、拡張子を付けないファイルとの違いはあるのでしょうか?

No.8276

Re:うまくファイルに書けない
投稿者---かずま(2003/07/11 09:35:24)


> たびたびすいませんが、かずまさんのプログラムではdatファイルを作成
> していますが、拡張子を付けないファイルとの違いはあるのでしょうか?

違いはありません。