我有一个数据文件,其中包含以下半径,密度,加速度和压力信息:
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]);
}
}
答案 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 */ }