如何将数据集从文本文件读取到二维矩阵
How to read dataset from text file to a 2D matrix
我有一个形式为
的数据集
0.547,0.797,2.860,1.398,Sharp-Right-Turn
0.541,0.786,2.373,1.919,Sharp-Right-Turn
0.549,0.784,2.370,1.930,Sharp-Right-Turn
0.983,0.780,2.373,1.701,Move-Forward
0.984,0.780,2.372,1.700,Move-Forward
0.983,0.780,2.378,1.602,Move-Forward
0.983,0.780,2.381,1.701,Move-Forward
.
.
ROWS=5456, COL 5
在 MATLAB 中很容易将文本文件加载到数据矩阵中。但我在 C 中苦苦挣扎。
我试过这段代码
int main()
{
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
} record[ROW][COL];
FILE *file;
int i, j;
memset(record, 0, sizeof(record));
file = fopen("sensor.txt", "r");
if (file == NULL) {
printf("File does not exist!");
} else {
for (i = 0; i < ROW; ++i) {
for (j = 0; j < COL; ++j) {
fscanf(file, "%f,%f,%f,%f,%s", &record[i][j].at1, &record[i][j].at2, &record[i][j].at3, &record[i][j].at4, &record[i][j].at5);
}
}
}
fclose(file);
for (i = 0; i < ROW; ++i)
for (j = 0; j < COL; ++j) {
printf("%f\t%f\t%f\t%f\t%s\n", record[i][j].at1, record[i][j].at2, record[i][j].at3, record[i][j].at4, record[i][j].at5);
}
return 0;
}
我得到无限行和 4 列 0.000000
。
我想将前四列保存在一个矩阵中,将最后一列保存为另一个列矩阵。我可以那样做吗?
我必须构建一个分类器,这在 MATLAB 中很容易完成,无需使用预定义函数,但在 C 中读取数据会妨碍我的代码。
我知道这可能是一个重复的问题,但我尝试了其他线程中的解决方案,它们不适用于我的数据集。
首先,您定义了一个包含所有字段的记录,这些字段一起构成了每一行。这意味着当您阅读时,您拥有一行的所有值,因此结构维度应该是可用的最大记录,它是一个 单维结构数组 record
.
但是你不能在栈上分配这么大的结构,它会溢出,最好在动态内存中分配它:
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
} record;
struct node *record = malloc(sizeof(struct node) * MAXRECORDS);
另一个错误在 scanf
,结构的最后一个字段 record
已经是一个指向 char 的指针,因此您不需要取消引用它。
这是一个工作代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXRECORDS 10
int main(int argc, char *argv[])
{
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
};
struct node *record = malloc(sizeof(struct node) * MAXRECORDS);
FILE *file;
int nRecords = 0;
memset(record, 0, sizeof(record));
file = fopen("sensor.txt", "r");
if (file == NULL)
{
printf("File does not exist!");
}
else
{
while (EOF != fscanf(file, "%f,%f,%f,%f,%s", &record[nRecords].at1, &record[nRecords].at2,
&record[nRecords].at3, &record[nRecords].at4, record[nRecords].at5) && nRecords<MAXRECORDS)
{
nRecords++;
}
}
fclose(file);
for (int i = 0; i < nRecords; ++i)
{
printf("%f\t%f\t%f\t%f\t%s\n",
record[i].at1, record[i].at2,
record[i].at3, record[i].at4, record[i].at5);
}
return 0;
}
在 'real' 应用程序中,您希望将数组维数到某个足够大的值,当您到达分配的末尾时 space 您可以将其重新分配给其他数据。这使您可以在读取之前不知道条目数的情况下读取所需条目数的文件。
P.S。我添加了检查要读取的最大记录数。但这仍然是一个示例,许多检查仍然缺失,即我不检查 malloc 返回的值。
我有一个形式为
的数据集0.547,0.797,2.860,1.398,Sharp-Right-Turn 0.541,0.786,2.373,1.919,Sharp-Right-Turn 0.549,0.784,2.370,1.930,Sharp-Right-Turn 0.983,0.780,2.373,1.701,Move-Forward 0.984,0.780,2.372,1.700,Move-Forward 0.983,0.780,2.378,1.602,Move-Forward 0.983,0.780,2.381,1.701,Move-Forward . . ROWS=5456, COL 5
在 MATLAB 中很容易将文本文件加载到数据矩阵中。但我在 C 中苦苦挣扎。 我试过这段代码
int main()
{
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
} record[ROW][COL];
FILE *file;
int i, j;
memset(record, 0, sizeof(record));
file = fopen("sensor.txt", "r");
if (file == NULL) {
printf("File does not exist!");
} else {
for (i = 0; i < ROW; ++i) {
for (j = 0; j < COL; ++j) {
fscanf(file, "%f,%f,%f,%f,%s", &record[i][j].at1, &record[i][j].at2, &record[i][j].at3, &record[i][j].at4, &record[i][j].at5);
}
}
}
fclose(file);
for (i = 0; i < ROW; ++i)
for (j = 0; j < COL; ++j) {
printf("%f\t%f\t%f\t%f\t%s\n", record[i][j].at1, record[i][j].at2, record[i][j].at3, record[i][j].at4, record[i][j].at5);
}
return 0;
}
我得到无限行和 4 列 0.000000
。
我想将前四列保存在一个矩阵中,将最后一列保存为另一个列矩阵。我可以那样做吗?
我必须构建一个分类器,这在 MATLAB 中很容易完成,无需使用预定义函数,但在 C 中读取数据会妨碍我的代码。
我知道这可能是一个重复的问题,但我尝试了其他线程中的解决方案,它们不适用于我的数据集。
首先,您定义了一个包含所有字段的记录,这些字段一起构成了每一行。这意味着当您阅读时,您拥有一行的所有值,因此结构维度应该是可用的最大记录,它是一个 单维结构数组 record
.
但是你不能在栈上分配这么大的结构,它会溢出,最好在动态内存中分配它:
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
} record;
struct node *record = malloc(sizeof(struct node) * MAXRECORDS);
另一个错误在 scanf
,结构的最后一个字段 record
已经是一个指向 char 的指针,因此您不需要取消引用它。
这是一个工作代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXRECORDS 10
int main(int argc, char *argv[])
{
struct node {
float at1;
float at2;
float at3;
float at4;
char at5[30];
};
struct node *record = malloc(sizeof(struct node) * MAXRECORDS);
FILE *file;
int nRecords = 0;
memset(record, 0, sizeof(record));
file = fopen("sensor.txt", "r");
if (file == NULL)
{
printf("File does not exist!");
}
else
{
while (EOF != fscanf(file, "%f,%f,%f,%f,%s", &record[nRecords].at1, &record[nRecords].at2,
&record[nRecords].at3, &record[nRecords].at4, record[nRecords].at5) && nRecords<MAXRECORDS)
{
nRecords++;
}
}
fclose(file);
for (int i = 0; i < nRecords; ++i)
{
printf("%f\t%f\t%f\t%f\t%s\n",
record[i].at1, record[i].at2,
record[i].at3, record[i].at4, record[i].at5);
}
return 0;
}
在 'real' 应用程序中,您希望将数组维数到某个足够大的值,当您到达分配的末尾时 space 您可以将其重新分配给其他数据。这使您可以在读取之前不知道条目数的情况下读取所需条目数的文件。
P.S。我添加了检查要读取的最大记录数。但这仍然是一个示例,许多检查仍然缺失,即我不检查 malloc 返回的值。