从读取文件制作数组

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 is while ( !feof (file) ) always wrong?谁在教这个?请注意,拥有像 float latarray[64800], lonarray[64800], valarray[64800]; 这样大的堆栈数据是不明智的。 您在堆栈上分配了三个非常大的数组。考虑动态分配这些数组:float* latarray = malloc(sizeof(float) * 64800); &c。 (完成后使用free(latarray)。) 程序缺少错误检查——fgetssscanf的成功,或者数组索引。 结构数组通常比 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)

以上是关于从读取文件制作数组的主要内容,如果未能解决你的问题,请参考以下文章

读取 3 个文件并用它们制作数组

读取.text文件并制作数组(java)

如何读取图片文件,并且放在一个byte数组当中?

MATLAB:从读取并放入单元格的csv文件制作直方图?

求一个Cstring类数组文件读取代码

从文件中读取为 char 数组