3

我有一个 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);

我只需要知道我是否以正确的方式进行此操作.....谢谢!

4

1 回答 1

0

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

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