![](/img/trans.png)
[英]Reading from file into array and performing operations with numbers in the array
[英]Performing Operations on an Array
好的,所以我对这个网站的编程和发布都是陌生的,我的问题有点复杂,但是我将尝试阐明我的情况。 我正在尝试编写代码以读取大小未知的文件(极坐标列表),将值存储在数组中,然后执行转换并使用转换后的数据获取新数组(从技术上讲,我正在使用这个预先设计好的函数中的这个新数组可以用C ++绘制数据,但这并不重要,因为它是分配的一部分,当然也不是错误的来源。
我有2个主要问题,第一个是可变数组大小。 在下面的代码中,您可以看到我的x和y数组没有约束,因此即使r []中除了r [40]之外也没有任何内容,循环仍将转换为x [999]。 我可以限制r和theta数组的大小,因为当fscanf函数到达文件末尾时,我可以编写代码以停止读取值,但是我不知道x和y数组的类比。 (此外,如果有人可以解释为什么我的字符数组没有这个问题,即使它被定义为最多128个字符,我也将不胜感激。这可能会给我我所需要的见解)
其次,转换不太匹配。 因此,当我打印转换后的值时,该函数将正确转换它们,但将从r [i]和theta [i]转换为x [i + 1]和y [i + 1]的值存储起来。 我真的不知道是什么导致了这个问题。
我当然希望我的问题有意义。 任何帮助,将不胜感激! 如果有任何不清楚的地方,请让我知道,我会尽力解释。 谢谢!
#include <stdio.h>
#include <math.h>
#define ARRAYSIZE 1000
#define FILENAMESIZE 128
float convertx(float r[], float theta[], int numPoints);
float converty(float r[], float theta[], int numPoints);
int cmain() {
int i;
float r[ARRAYSIZE], theta[ARRAYSIZE], x[ARRAYSIZE], y[ARRAYSIZE];
char filename[FILENAMESIZE];
FILE *InputFile;
printf("Type the data file name: ");
scanf("%s", filename);
InputFile = fopen(filename,"r");
if(InputFile == NULL){
printf("Error, could not open file: %s.\n",filename);
return 1;
}
for(i=0; i < ARRAYSIZE; i++){
if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) break;
printf("Value %d is %f\n",i+1,r[i]);
}
fclose(InputFile);
for(i=0; i < ARRAYSIZE; i++){
x[i] = convertx(r,theta,i);
printf("Value %d is %f\n",i+1,x[i]);
}
for(i=0; i < ARRAYSIZE; i++){
y[i] = converty(r,theta,i);
}
return 0;
}
float convertx(float r[], float theta[], int numPoints){
int i;
float x;
for(i=0; i < numPoints; i++)
x = r[i]*cos(theta[i]);
return x;
}
float converty(float r[], float theta[], int numPoints){
int i;
float y;
for(i=0; i < numPoints; i++)
y = r[i]*sin(theta[i]);
return y;
}
编辑:请求的是输入文件的代码段。 这是前几点(文件中没有逗号,只有空格。不幸的是,我在此站点上的格式化技巧很糟糕):
60,3.9269875
60,0.7853975
0,0
1,0.25
2、0.5
对于第一个问题,r和theta的for循环在文件末尾停止的原因是因为您有一个break;
当您检测到EOF时退出for循环。 您的x和y for循环中没有那个。
为了解决这个问题,而不是使用您的ARRAYSIZE常量,请编辑:{将Final i值保存在r和theta for循环中,它将是行数或+1,并将其用作x中的最终值和y for循环。 像这样:
for(i=0; i < ARRAYSIZE; i++){
if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) {
int final = i;
break;
}
printf("Value %d is %f\n",i+1,r[i]);
}
fclose(InputFile);
for(i=0; i < final; i++){
x[i] = convertx(r,theta,i);
printf("Value %d is %f\n",i+1,x[i]);
}
之前我曾说过,可以将数组的大小用于r或theta: for (i=0; i < r.size(); i++) {
,但是由于将其长度初始化为1000无效。 }
对于第二个问题:我认为,如果您在convertx和converty函数中摆脱了for循环,那将解决问题。 那是因为只返回了x或y的最后一个值,因此您从i = 0到i =(numPoints-2)的计算被丢弃了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.