-1

フォームのデータセットがあります

0.547,0.797,2.860,1.398,急右折

0.541,0.786,2.373,1.919,急右折

0.549,0.784,2.370,1.930,急右折

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,前方へ移動

.
.


行 = 5456、列 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しか得ていません。

最初の 4 列を 1 つのマトリックスに保存し、最後の列を別の列マトリックスとして保存したいと考えています。私はそれを行うことができますか?

事前定義された関数を使用せずに MATLAB で簡単に作成した分類器を作成する必要がありますが、C でデータを読み取るとコードが妨げられます。

これは繰り返される質問かもしれませんが、他のスレッドで解決策を試しましたが、私のデータセットでは機能していません。

4

1 に答える 1

2

まず最初に、すべてのフィールドを保持するレコードを定義し、それらが一緒になって各行を形成します。これは、読み取るときに行のすべての値があるため、構造体の次元は、構造体の単次元配列で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 によって返される値をチェックしていません。

于 2015-08-20T12:47:14.930 に答える