3

私は構造の3D配列を持っています。3D グリッドは、3 つの辺のそれぞれが等しいようなものです。3D グリッドの各セルには、色、温度、B(x)、B(y)、B(z) の 5 つの要素があります。構造体の配列の各セルに、要素ごとに 1 つずつ、5 つのバイナリ ファイルを設定する必要があります。

構造体の配列は次のようになります。

struct physical
{
  float color;
  float temperature;
  float Bx,By,Bz;
};
extern struct physical ***physical;

私が必要としているのは、C で配列にデータを入力する方法を考えることです。

バイナリ ファイルから構造体の配列にデータを読み取るために実装した次のコードがあります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int i,j,k,ibox;         /* Loop indices for the physical grid */

FILE *p,*q,*r,*s,*t;

p = fopen("phys_col_0107.bin","rb");
q = fopen("phys_temp_0107.bin","rb");
r = fopen("phys_Bx_0107.bin","rb");
s = fopen("phys_By_0107.bin","rb");
t = fopen("phys_Bz_0107.bin","rb");

if (!p)      { printf("Unable to open color file!"); return 0; }
else if (!q) { printf("Unable to open the temp file!"); return 0; }
else if (!r) { printf("Unable to open the Bx file!"); return 0; }
else if (!s) { printf("Unable to open the By file!"); return 0; }
else if (!t) { printf("Unavle to open the Bz file!"); return 0; }

for ( j = 0 ; j < ny ; j++ )
{
  for (k=0;k<nz;k++)
  {
    for (i=0;i<nx;i++)
    {
      fread( &physical[i][j][k].color       , sizeof(physical[i][j][k].color)       , 1 , p ) ;
      fread( &physical[i][j][k].temperature , sizeof(physical[i][j][k].temperature) , 1 , q ) ;
      fread( &physical[i][j][k].Bx          , sizeof(physical[i][j][k].Bx)          , 1 , r ) ;
      fread( &physical[i][j][k].By          , sizeof(physical[i][j][k].By)          , 1 , s ) ;
      fread( &physical[i][j][k].Bz          , sizeof(physical[i][j][k].Bz)          , 1 , t ) ;
    }
  }
}

fclose(p);
fclose(q);
fclose(r);
fclose(s);
fclose(t);

私はこれについて正しい方法で行っているかどうかを知る必要があります.....ありがとう!!

4

1 に答える 1

0

私の頭の上からこれを行うためのいくつかの方法:

  1. データが 3D 配列のサイズと等しくなるようにします。未使用または空の要素を 0 などの他のセンチネル値で埋めて、それが「本物ではない」ことがわかるようにします。これはスペースの効率は悪くなりますが、データの読み取りと設定が単一の fread() 呼び出しと同じくらい簡単になります。
  2. 次の実行が有効なデータであるか空であるかを示す 1 バイトの RLE タイプ スキームを使用します (0 回の実行が許可されていない場合は最大 127 または 128)。有効なデータの場合は、その多くの構造を読み取り、グリッドに直接ロードします。無効な実行の場合、その数の構造をスキップするか、何らかの方法でそれらを無効としてマークします。かなりスペース効率が良いという利点がありますが、複数の IO 呼び出しが必要になるため、読み取りが遅くなります。
  3. 各要素を XML ファイルの型として設定できる XML データ形式。データファイルを編集するのは簡単ですが、構造を作成するのははるかに遅く、ディスク上ではバイナリ手法よりもはるかに大きくなります。
于 2013-06-18T21:45:56.807 に答える