Как прочитать набор данных из текстового файла в 2D матрицу

У меня есть набор данных формы

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, Переместить вперед

0.984,0.780,2.372,1.700, Переместить вперед

0.983,0.780,2.378,1.602, Переместить вперед

0.983,0.780,2.381,1.701, Переместить вперед,,


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 мешает моему коду.

Я знаю, что это может быть повторяющийся вопрос, но я пробовал решения в других потоках, они не работают в моем наборе данных.

1 ответ

Решение

Прежде всего, вы определили запись, содержащую все ваши поля, которые вместе образуют каждую строку. Это означает, что когда вы читаете, у вас есть все значения для строки, поэтому измерение структуры должно быть максимально доступной записью, представляющей собой одномерный массив структур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;
}

В "реальном" приложении вы хотите, чтобы размер массива был достаточно большим, и когда вы достигнете конца выделенного пространства, вы можете перераспределить его для других данных. Это позволяет вам прочитать файл с тем, сколько записей вы хотите, не зная их номера, перед чтением.

PS Я добавил проверку на максимальное количество записей для чтения. Но это остается примером, многие проверки все еще отсутствуют, т.е. я не проверяю значение, возвращаемое malloc.

Другие вопросы по тегам