将数据存储在数组中

时间:2011-09-29 22:34:34

标签: c arrays

我有一个数据文件,其中包含以下半径,密度,加速度和压力信息:

1.464e + 22 1.403e-25 1.290e-08 6.325-10

1.539e + 22 1.394e-25 1.680e-08 6.309-10

1.616e + 22 1.384e-25 2.030e-08 6.289e-10

1.693e + 22 1.373e-25 2.344e-08 6.266e-10

1.769e + 22 1.362e-25 2.628e-08 6.239e-10

如何将这些数据存储在数组中(例如radius[]density[])?读取数据文件的代码如下:

#include"stdio.h"

#define NDATA 5

int main()    
{    
    FILE *fo;

    int i;
    float r[NDATA];
    float rho[NDATA];
    float g[NDATA];
    float p[NDATA];

    fo = fopen("data.txt", "r");


    /* Read data */
    for (i = 0; i<NDATA; i++)
    {   
        fscanf(fo, "%f %f %f %f", &r[i], &rho[i], &g[i], &p[i]);
        printf(" read line %d %e %e %e %e\n", i, r[i], rho[i], g[i], p[i]);
    }   
} 

2 个答案:

答案 0 :(得分:1)

#include"stdio.h"

#define NDATA 5

int main()    
{    
    FILE *fo;

    int i;
    float r[NDATA];
    float rho[NDATA];
    float g[NDATA];
    float p[NDATA];

    fo = fopen("data.txt", "r");
    fscanf();
    fscanf();

    /* Read data */
    for (i = 0; i<NDATA; i++)
    {   
        fscanf(fo, "%f %f %f %f", &r[i], &rho[i], &g[i], &p[i]);
        fscanf(fo);
        printf(" read line %d %e %e %e %e\n", i, r[i], rho[i], g[i], p[i]);
    }   
} 

这应该有效,因为你不会在前两行和空行中阅读。

答案 1 :(得分:0)

关于extern:我会尽量避免它。这可能是一个评论,但评论只是限制所以代码块如下。它使用一个非常古老的C技巧来malloc()一个具有可变大小成员的结构。这个技巧为您提供了一个可以轻松传递给呼叫者的指针。指针指向一个包含易于使用格式的所有内容的结构。最重要的是,它只使用一个malloc()来分配所有需要大小的数组。

如果您需要添加新成员,请在“数据”成员之前添加它们,如果不重新编译所有内容,您将有更少的错误机会。

data.h文件

#include <stdlib.h>

typedef struct data_struct
{
    int ndata;
    float *r;
    float *rho;
    float *g;
    float *p;
    float  data[1];
} data_t;

static struct data_struct *data_malloc( int n )
{
    data_t *ptr = malloc( 
                sizeof(data_t) +           /* base struct size */
                n * sizeof(float) -        /* actual data */
                sizeof(float) );           /* remove extra data[0] */

    ptr->ndata = n;             /* populate size so users have it */

        /* while extending data_struct this way is horrid C++,
         * it is well used, classic, C, accepted by every compiler */
    ptr->r   = ptr->data;       /* beginning of data array */
    ptr->rho = ptr->r   + n;    /* follows r   */
    ptr->g   = ptr->rho + n;    /* follows rho */
    ptr->p   = ptr->g   + n;    /* follows g   */

    return   ptr;
}

static void data_free( struct data_struct *ptr )
{

    if ( ptr && ptr->ndata )
    {   /* have data, will free */
        ptr->ndata = 0;         /* zero the size as fail-safe */
        free( ptr );
    }

    return;
}

主程序

#include 

#define NDATA 5

int main()
{
    FILE *fo;

    int i;
    data_t  *ptr = data_malloc( NDATA );

    fo = fopen("data.txt", "r");

    /* Read data */
    for (i = 0; i < NDATA; i++)
    {
        fscanf(fo, "%f %f %f %f", ptr->r+i, ptr->rho+i, ptr->g+i, ptr->p+i);
        printf(" read line %d %e %e %e %e\n", i,
                 ptr->r[i], ptr->rho[i], ptr->g[i], ptr->p[i]);
    }
    for (i = 0; i < NDATA; i++)
    {
        printf(" read line %d %e %e %e %e\n", i,
                 ptr->r[i], ptr->rho[i], ptr->g[i], ptr->p[i]);
    }

    some_function(ptr);  /* pass the pointer down as a single pointer */

    data_free(ptr);     /* always good to free anything you malloc */
}