我需要从文本文件中读取x和y坐标,然后将它们用于多项式回归。我可以做回归部分,但我无法读取文件中的值。数据点是
5,10,15,20,25,30,35,40,45,50
17,24,31,33,37,37,40,40,42,41
第一行是x,第二行是y,它们在txt文件中完全按照这样写。
从另一个问题我设法将所有数字读入一个20的单个x数组,但我真的需要它们在单独的数组中作为x和y。我怎样才能做到这一点? 这是我目前的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *data;
data = fopen("data.txt", "r");
int x[20];
int i=0;
for(i=0; i<20; i++)
fscanf(data, "%d,", &x[i]);
for(i=0; i<20; i++)
printf("x are: %d\n", x[i]);
fclose(data);
return 0;
}
提前致谢。
答案 0 :(得分:0)
如果问题中所述,如果您总是在一行中有10个int而在另一行中有10个int,则可以再使用一个数组int y[10];
来存储y
值。并使用两个for
循环 - 一个用于读取10个x值,另一个用于读取10 y值。并且您的数组都只需要存储10
个元素。
int x[10];
int y[10]; // Array to store y values
int i=0;
for(i=0; i<10; i++) // Read first 10 values to x array
fscanf(data, "%d,", &x[i]);
for(i=0; i<10; i++) // Read next 10 values to y array
fscanf(data, "%d,", &y[i]);
for(i=0; i<10; i++)
printf("x are: %d\n", x[i]);
for(i=0; i<10; i++)
printf("y are: %d\n", y[i]);
但是,如果在这些行中有可能存在不同数量的整数 - 大于或小于10 - 那么您将需要进行更多检查。
答案 1 :(得分:0)
检查是否存在逗号
int x[20], y[20];
int i, n;
char tail;
for(i = 0; i < 20 && 2 == fscanf(data, "%d%c", &x[i], &tail); i++){
if(tail != ',')
break;
}
n = i+1;//if(n > 20){ puts("bad format!"); return -1;}
for(i = 0; i < n; i++)
fscanf(data, "%d,", &y[i]);
fclose(data);
for(i = 0; i < n; i++)
printf("(%d, %d)\n", x[i], y[i]);
答案 2 :(得分:0)
首先,我建议您按成对编写x
和y
值(似乎更合乎逻辑,因此实现起来更简单)。例如:
1 2
3 4
5 6
所以fscanf(FILE* fp, char* format,...)
:
FILE* fp
- 指向要从中读取数据的流的指针(可以是标准stdin
,使fscanf()
作为scanf()
);
char* format
- 格式字符串(例如:"%d%s%d"
);
...
- 将接收输入数据的内存中变量和/或区域的地址。变量数由char* format
指定。
您使用fscanf(data, "%d,", &x[i]);
而不是fscanf(data, "%d%d", &x[i],&y[i]);
忘记您获得的数据与char* format
中指定的数据一样多。
另请注意,fscanf()
以及scanf()
会返回成功输入数据的数量,这意味着您可以执行以下操作:
while(fscanf(data,"%d%d",&x[i],&y[i]) == 2) {
// do something, or don't
}
您可以将while
留空。最后,您将x
和y
点存储在不同的数组中。会发生什么是fscanf()
尝试读取两个整数值。如果他设法做到这一点,他返回成功输入数据的数量,意思是2.否则他返回1(如果你错过x
或y
对)或0(如果它是文件结束)