从读取文件制作数组
Posted
技术标签:
【中文标题】从读取文件制作数组【英文标题】:making arrays from reading file 【发布时间】: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 iswhile ( !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
格式?
【参考方案1】:
没有迭代限制
避免重复太多。使用 while(!feof(fp))
代码 likely 迭代 1 太多。
// while(!feof(fp))
//
// fgets(buf,8000,fp);
while (i < 64800 && fgets(buf, sizeof buf, fp))
大型本地对象
考虑分配
// float latarray[64800],lonarray[64800],valarray[64800];
#define N 64800
float *latarray = malloc(sizeof *latarray * N);
float *lonarray = malloc(sizeof *lonarray * N);
float *valarray = malloc(sizeof *valarray * N);
健壮的代码也会检查分配是否成功。
if (latarray == NULL || ...) Handle_OutOfMemory();
不安全的扫描
sscanf(buf,"%s %s %s\n",lat,lon,val);
可能会溢出缓冲区。使用sscanf(buf,"%99s %99s %99s",lat,lon,val);
或
if (sscanf(buf,"%f %f %f", &latnum, &lonnum, &valnum) != 3)
Handle_ParsingError();
或查看strtof()
。
缺少fclose()
完成后清理。
【讨论】:
我试过这个并得到以下浮点 array = malloc 代码错误:fileread.c: In function 'int main(int, char*)': fileread. c:16:51: 错误:从 'void*' 到 'float*' 的无效转换 [-fpermissive] float* latarray = malloc(sizeof(float) * 64800); ^ @jms1980 您使用的是 C 编译器吗?或其他一些语言编译器,如 C++ 来解决这个 C 问题?顺便说一句,这个答案不使用sizeof(float)
。以上是关于从读取文件制作数组的主要内容,如果未能解决你的问题,请参考以下文章