读取 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"
(二进制)。
为malloc
、sscanf
、argc
添加错误检查。删除不使用的变量。
您可以使用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 个文件并用它们制作数组的主要内容,如果未能解决你的问题,请参考以下文章
如何读取 bash 中的行并用指定的分隔符分隔它们? [复制]