前一阵在KNN机器学习算法中提到从文本文件读取数据的问题。
回头又想了想,找到一个比较通用的办法,不用事先扫描一次文本文件了。
预先定义一个最多能读的数据行数:
#define MAX_NUM_LINE 1000
每行的数字属性个数预定义为NUM_COUNT_PER_LINE:
#define NUM_COUNT_PER_LINE 5
//从给定的文件里读取数据,全部数据以一个空白行为结束
void read_data_from_file(FILE * fpr)
{
if(NULL!=fpr)
{
int i=0, r=0, isEnd=1;
double A[MAX_NUM_LINE][NUM_COUNT_PER_LINE] = {0.0};
char B[MAX_NUM_LINE];
while ((isEnd!=-1)&&(r<MAX_NUM_LINE))
{
for(i=0;i<NUM_COUNT_PER_LINE;i++)
{
isEnd=fscanf(fpr, "%lf ", A[r]+i); //读取数字数据,以空格分隔
if(isEnd==-1) //一旦读取完数据,遇到最后的空白行,fscanf()就会返回-1,就要终止读取数据了,先跳出for循环.
break;
}
if(isEnd==-1)
break; //一旦读取完数据,遇到最后的空白行,fscanf()就会返回-1,就要终止读取数据了,先跳出for循环,再跳出while循环.
isEnd=fscanf(fpr, "%c\n", B+r);
if(isEnd==1)
r++;
else
break;
}
//打印读出的数据,以便验证
for(int jr=0;jr<r;jr++)
{
for(i=0;i<NUM_COUNT_PER_LINE;i++)
printf("%g\t", A[jr][i]);
printf("%c\n", B[jr]);
}
}
}
//在主函数里调用
int main(int argc, char *argv[])
{
FILE *fp1;
fp1 = fopen("l1.txt", "r");
read_data_from_file(fp1);
fclose(fp1);
return(0);
}
经测试,通过。