【问题标题】:Reading 3 files and making arrays out of them读取 3 个文件并用它们制作数组
【发布时间】:2022-01-20 02:06:46
【问题描述】:

我有三个文本文件,其中包含一个行列表,每行包含一个纬度经度和值。这些数组涵盖了不同的纬度和经度范围。现在我要制作三个不同的纬度数组、三个不同的经度数组和三个不同的值数组,其中每个文本文件都应该生成一个纬度、经度和值数组。

下面是我试图完成此操作的 c 代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>


int main(int argc, char *argv[])
{
    FILE    *fp=NULL, *fpb=NULL, *fpc=NULL, *FPOUT=NULL;
    char    inpFname[81],inpFnameb[81],inpFnamec[81],FILEOUT[81];
    int     i,j,k;
    char    buf[8000];
    int     count;
    char    datetime[10],year[4],month[2],day[2],hour[2],type[10];

    float   latnum,lonnum,valnum;
    float   latnumb,lonnumb,valnumb;
    float   latnumc,lonnumc,valnumc;

    float*  latarray = malloc(sizeof(float) * 1038240);
    float*  lonarray = malloc(sizeof(float) * 1038240);
    float*  valarray = malloc(sizeof(float) * 1038240);

    float*  latarrayb = malloc(sizeof(float) * 3185);
    float*  lonarrayb = malloc(sizeof(float) * 3185);
    float*  valarrayb = malloc(sizeof(float) * 3185);

    float*  latarrayc = malloc(sizeof(float) * 5265);
    float*  lonarrayc = malloc(sizeof(float) * 5265);
    float*  valarrayc = malloc(sizeof(float) * 5265);


    sprintf(datetime,"%s",argv[1]);


    sprintf(inpFname,"100_%s.txt1",datetime);
    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(i < 1038240 && fgets(buf,sizeof buf, fp))
    {
        sscanf(buf,"%f %f %f\n",&latnum,&lonnum,&valnum);
    
        latarray[i]=latnum;
        lonarray[i]=lonnum;
        valarray[i]=valnum;
    
    
        i=i+1;  
    }
    fclose(fp);

    sprintf(inpFnameb,"100_%s.txt2",datetime);
    printf("%s\n",inpFnameb);

    if ((fpb=fopen(inpFnameb,"rt"))==NULL)
    {
        printf("\nERROR: Cannot open/read input file [%s]\n\n",inpFnameb);
    }

    i=0;
    while(i < 3185 && fgets(buf,sizeof buf, fpb))
    {
        sscanf(buf,"%f %f %f\n",&latnumb,&lonnumb,&valnumb);
    
        latarrayb[i]=latnumb;
        lonarrayb[i]=lonnumb;
        valarrayb[i]=valnumb;
    
        i=i+1;  
    }
    fclose(fpb);

    sprintf(inpFnamec,"100_%s.txt3",datetime);
    printf("%s\n",inpFnamec);

    if ((fpc=fopen(inpFnamec,"rt"))==NULL)
    {
        printf("\nERROR: Cannot open/read input file [%s]\n\n",inpFnamec);
    }

    i=0;
    while(i < 3185 && fgets(buf,sizeof buf, fpb))
    {
        sscanf(buf,"%f %f %f\n",&latnumc,&lonnumc,&valnumc);
    
        latarrayc[i]=latnumc;
        lonarrayc[i]=lonnumc;
        valarrayc[i]=valnumc;
    
        i=i+1;  
    }
    fclose(fpc);


}

不幸的是,在运行此代码时,我遇到了分段错误。如果我取出第三组数组(arrayc),我没有得到这个分段错误,所以可能存在内存问题。如何调整这个程序,以免出现分段错误,并能够达到我想要的结果,即为每个文件获取一个纬度、经度和值数组,总共 9 个数组?

【问题讨论】:

    标签: arrays c file buffer


    【解决方案1】:

    您可以创建一组足够容纳所有文件的数组,然后将数据直接读入大数组,而不是创建 3 组数组并稍后将它们组合起来。

    所有文件看起来都具有相同的格式,因此请使用函数重复相同的读取操作。每个文件不需要3组临时变量。

    "r" 格式打开文件。有效的开放读取模式是"r""rb"(二进制)。

    mallocsscanfargc 添加错误检查。删除不使用的变量。

    您可以使用realloc 改进代码,这样您就不必提前知道数组的大小。

    void readfile(const char *filename, int *iptr, int count,
        float* latarray, float* lonarray, float* valarray)
    {
        int i = *iptr;
        char buf[8000];
        FILE* fp = fopen(filename, "r");
        if (!fp) { perror(filename); exit(1); }
        while (i < count && fgets(buf, sizeof buf, fp))
        {
            if (sscanf(buf, "%f %f %f\n", 
                &latarray[i], &lonarray[i], &valarray[i]) != 3)
                continue;
            i++;
        }
        *iptr = i;
        fclose(fp);
    }
    
    int main(int argc, char* argv[])
    {
        if (argc < 2) return 0;
        char datetime[10];
        sprintf(datetime, "%s", argv[1]);
    
        char filename[100];
    
        int i = 0;
        int count = 1038240 + 3185 + 5265;
        float* latarray = malloc(sizeof(float) * count);
        float* lonarray = malloc(sizeof(float) * count);
        float* valarray = malloc(sizeof(float) * count);
        if (!latarray) return 0;
        if (!lonarray) return 0;
        if (!valarray) return 0;    
    
        sprintf(filename, "100_%s.txt1", datetime);
        readfile(filename, &i, count, latarray, lonarray, valarray);
    
        sprintf(filename, "100_%s.txt2", datetime);
        readfile(filename, &i, count, latarray, lonarray, valarray);
    
        sprintf(filename, "100_%s.txt3", datetime);
        readfile(filename, &i, count, latarray, lonarray, valarray);
    
        printf("Total lines read: %d\n", i);
    
        free(latarray);
        free(lonarray);
        free(valarray);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2021-06-24
      • 2021-03-17
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      相关资源
      最近更新 更多