【问题标题】:Scanning data into a multidimensional array将数据扫描到多维数组中
【发布时间】:2017-04-14 17:33:07
【问题描述】:

我从一个文件中获得了数据,其中包括一个点的质量和 (x,y,z) 位置。我现在想获取给定的数据并使用多维数组将其输出到文件中。但是,我不知道如何获取扫描数据并在数组中使用它。

我的数据存储如下:

for(i = 0; i < n; i++)      //scan in file data
{
    fscanf(fpin, "%d %d %d %d", &array_x[i], &array_y[i], &array_z[i], &array_mass[i]);
}

我尝试将我的数组设置为[][4],因为行数取决于给定的数据点的数量(并且说明是编写一个适用于任意数量数据点的数组,而不仅仅是给定),将有 4 列(一列分别用于 x、y、z 和质量)。

然后我尝试将其设置为:

for(i = 0; i < n; i++)
{
    array_out[i][4] = { {array_x[i]}, {array_y[i]}, {array_z[i]}, {array_mass[i]} };
}

并将其打印为:

for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
        fprintf(fpout, "%d %d %d %d", array[i][j]);

但这不起作用。

【问题讨论】:

  • 你不能“将你的数组设置为[][4]。那没有意义。你需要为它分配内存。因为数据点的数量是可变的,你需要为它动态分配内存c-faq.com/aryptr/dynmuldimary.html 可能对你有帮助。
  • 尝试添加更完整的代码,特别是您的数组声明。

标签: c arrays multidimensional-array


【解决方案1】:

你知道你需要阅读多少元素吗?如果你这样做,那么你可以分配一个数组来保存它们。如果不这样做,则需要动态存储。

你的质量和点(x,y,z)的类型是什么?请提供样品。

您的 printf 格式说明符可能有问题(您真的是指 %d,因为它不是双重的)? (见:C printf using %d and %f

声明一个结构来包含您的点/质量,以及处理点质量的基本函数(方法),

声明存储,

typedef struct pointmass_struct {
    double mass;
    double x,y,z;
} pointmass_t ;

声明函数/方法,

pointmass_t*
pm_new( double mass, double x, double y, double z ) {
    pointmass_t* this;
    if( ! (this=malloc(sizeof(pointmass_t)) ) return(NULL);
    this->mass = mass;
    this->x = x;
    this->y = y;
    this->z = z;
    return(this);
}
void
pointmass_del( pointmass_t* pm ) {
    if(pm) free(pm);
    return;
}
pointmass_t*
pointmass_fromstr( char* line ) {
    double x, y, z, m;
    sscanf(line, "%f %f %f %f", &x, &y, &z, &m );
    pointmass_t* this = pointmass_new( x, y, z, m );
    return( this );
}
pointmass_t*
pointmass_fscanf( FILE* fp ) {
    double x, y, z, m;
    fscanf(fp, "%f %f %f %f", &x, &y, &z, &m );
    pointmass_t* this = pointmass_new( x, y, z, m );
    return( this );
}
char*
pointmass_tostr( pointmass_t* this, char* buff ) {
    if( !buff ) return(buff);
    sprintf(buff, "%f %f %f %f", this->x, this->y, this->z, this->mass );
    return(buff);
}
int
pointmass_print( pointmass_t* this )
{
    char pmbuff[100];
    return( printf("%s\n",pointmass_tostr(this,pmbuff) ) );
}

扫描一个点,

pointmass_t* pm = pointmass_fscanf(fpin);

将许多点质量扫描到声明的点质量数组中,

pointmass_t* pm_array[100]; //pick a suitable size
for(i = 0; i < n; i++) //scan point/mass elements from file
{
    pm_array[i] = pointmass_fscanf(fpin);
}

char pmbuff[100];
for(i = 0; i < n; i++) //print them
{
    printf("[%d] %s\n",pointmass_str(pm_array[i],pmbuff));
}

跟踪数组有多大,并动态增加大小,

pointmass_t** pm_dynarray;
int pmsize = 0;
pm_dynarray = malloc( (pmsize=500) * sizeof(pointmass_t*));
for(i = 0; i < n; i++) //scan from file
{
    if( i+1 > pmsize ) {
        pm_dynarray = realloc( (pmsize+=100) * sizeof(pointmass_t*));
    }
    pm_dynarray[i] = pointmass_fscanf(fpin);
}

for(i = 0; i<pmsize; i++ )
{
    printf("[%d] %s\n",i,pointmass_str(pm_dynarray[i],pmbuff));
}

记得释放所有这些点状元素,

for(i = 0; i<pmsize; i++ )
{
    if(pm_dynarray[i]) pointmass_del(pm_dynarray[i]);
    pm_dynarray[i] = NULL;
}
//now safe to free the array
free(pm_dynarray); pm_dynarray=NULL; pmsize=0;

更好的是,使用链表来存储 pointmass 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多