在C中填充3D结构数组

时间:2013-06-18 21:36:25

标签: c

我有一个3D结构阵列。 3D网格使得三个边中的每一个都相等。 3D网格的每个单元具有5个元素,例如颜色,温度,B(x),B(y)和B(z)。我必须用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);

我只需要知道我是否正确地采取这种方式.....谢谢!!

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点:

  1. 让您的数据等于3D数组的大小。用0s左右的其他标记值填充未使用或空元素,这样你就知道它“不真实”。这节省空间,但是使读取和设置数据就像单个fread()调用一样简单。
  2. 使用RLE类型方案,其中有1个字节,其中顶部位表示下一次运行是有效数据还是空,后跟运行中的字节数(如果不允许0运行,则最多127或128) 。如果有效数据,请读取许多结构并将其直接加载到网格中。如果运行无效,则跳过那么多结构或将它们标记为无效。优点是它非常节省空间,但读取速度较慢,因为需要多次IO调用。
  3. XML数据格式,您可以在其中将每个元素设置为XML文件中的类型。易于编辑数据文件,但填充结构要慢得多,而在磁盘上大得多,然后再高于二进制技术。