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

Posted

技术标签:

【中文标题】读取 3 个文件并用它们制作数组【英文标题】:Reading 3 files and making arrays out of them 【发布时间】: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 个数组?

【问题讨论】:

【参考方案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;

【讨论】:

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

VB如何读取一个图片,保存到字节数组中

如何按整数读取文件整数并将它们放入二维数组?

如何读取 bash 中的行并用指定的分隔符分隔它们? [复制]

C++:使用 fgetc 读取 csv 文件,并用分号“;”分隔单词

失败的 Binder 事务文本文件

从读取文件制作数组