【发布时间】:2022-01-14 17:34:28
【问题描述】:
我有一个程序,我在其中读取具有地理坐标和值的文件,如下所示:
-90 0 0.5
-90 1 0.2
-90 2 0.12
-90 3 0.15
...
-89 0 0.56
-89 1 0.12
...
此文件有 64800 行。我想要做的是在文本文件的第一列中创建一个值数组,这些值是纬度,第二列中的值是经度数组,最后是最终列值的第三个数组。
下面是我用来尝试完成此操作的程序的 sn-p:
int main(int argc, char *argv[])
{
FILE *fp=NULL;
char inpFname[81];
int i,j,k;
char buf[8000];
char lat[100],lon[100],val[100];
float latnum,lonnum,valnum;
float latarray[64800],lonarray[64800],valarray[64800];
sprintf(inpFname,"100_2021120700.txt");
printf("%s\n",inpFname);
if ((fp=fopen(inpFname,"rt"))==NULL)
{
printf("\nERROR: Cannot open/read input file [%s]\n\n",inpFname);
exit(1);
}
i=0;
while(!feof(fp))
{
fgets(buf,8000,fp);
sscanf(buf,"%s %s %s\n",lat,lon,val);
latnum=atof(lat);
lonnum=atof(lon);
valnum=atof(val);
printf("%d) lat %0.3f lon %0.3f value %0.3f\n",i,latnum,lonnum,valnum);
latarray[i]=latnum;
lonarray[i]=lonnum;
valarray[i]=valnum;
i=i+1;
}
}
不幸的是,我在运行这个程序时遇到了分段错误。如果我取出一个阵列,那么它运行良好。如何调整这个程序,以便我可以从文本文件的三列中的每一列中创建数组?
【问题讨论】:
-
请看Why is
while ( !feof (file) )always wrong?谁在教这个?请注意,拥有像float latarray[64800], lonarray[64800], valarray[64800];这样大的堆栈数据是不明智的。 -
您在堆栈上分配了三个非常大的数组。考虑动态分配这些数组:
float* latarray = malloc(sizeof(float) * 64800);&c。 (完成后使用free(latarray)。) -
程序缺少错误检查——
fgets和sscanf的成功,或者数组索引。 -
结构数组通常比 3 个数组更好。
-
与其扫描成字符串然后调用
atof(),不如直接在scanf()字符串中使用%f格式?