0

サンプル番号、値、およびステータス (1.1, 23,0) を含むファイルを読みたいと思います。その情報を保持するために構造体を使用しました。関数の構造体配列とファイルの場所を渡します。

#include <stdio.h>

struct Data_point
{
    long sampleNumber;
    double value;
    int status;
};


int filldata(struct Data_point *a, const char *filelocation)
{
    FILE *f;
    if((f=fopen(filelocation,"r"))==NULL)
    {
        printf("You cannot open");
    }
    fscanf(f, "%ld%lf%d", a.sampleNumber, a.value, a.status);
}



int main(void)
{
    struct Data_point data[10];
    filldata(data, "/home/alexchan/IntrotoC/rec11/dataPoints.txt");
    return 0;
}

しかし、「構造体ではないメンバーのリクエスト」というエラーが発生しました...

4

3 に答える 3

1

1 つの問題は、filldata()がポインター引数を取ることです。したがって、->「.」ではなくメンバーのアドレス指定に使用します。たとえば、そうa.sampleNumberあるべきです。a->sampleNumber

もう 1 つの問題はfilldata()、単一の構造体を読み取っているのに、配列の先頭へのポインタを渡していることです。これは と同義&(data[0])です。したがって、この関数を繰り返し呼び出すと、最初の要素が上書きされます (そうではありません)。ループで呼び出す場合は、個々の配列メンバーへのポインターで渡す必要があります。

for(int i = 0; i < 10; ++i){ filldata(&(data[i]), "/home/alexchan/IntrotoC/rec11/dataPoints.txt"); }

実際にはdata + i代わりに最初の引数として使用できますが&(data[i])、後者の方が読みやすいので気に入っています。

于 2012-04-13T04:16:40.160 に答える
0

struct Data_point *a は関数引数であり、配列であるデータを渡しています。基本的に、構造体ではない配列からメンバーにアクセスしようとしています。

多分

for( int i=0; i<10;++i)
    filldata(data[i],.....)

int filldata( struct Data_point a,...) //as you are using a.
于 2012-04-13T04:16:21.003 に答える
0

fscanf では、渡された引数ごとにデータへのポインターが必要です。AddressOf演算子を使用して、&各構造体メンバーへの参照を取得します。

int filldata(const char *filelocation, struct Data_point *a, int nElements)
{
    int n = 0;
    FILE *f = fopen(filelocation, "r");
    if(f)
    {
        while (fscanf(f, "(%ld,%lf,%d)", &(a[n].sampleNumber), &(a[n].value), &(a[n].status)) == 3 && n < nElements)
             n++;
        fclose(f);
    } 
    else { printf("Unable to open '%s'\n", filelocation); }
    return n;
}

さて、この関数はあなたのものとは少し異なります。「a」パラメーターとして渡す配列の長さを伝える必要があります。正常に入力されたエントリの数を返します。

すなわち

int main(int argc, char **argv)
{
    struct Data_point data[10];
    int n = filldata("C:\\Users\\254288b\\temp.txt", data, sizeof(data) / sizeof(struct Data_point));
    printf("%d Data_point's were filled successfully.\n\n", n);
    for(int i = 0; i < n; i++)
    {
        printf("Sample Number: %ld\n", data[i].sampleNumber);
        printf("Value: %lf\n", data[i].value);
        printf("Status: %d\n", data[i].status);
        printf("----------------------------\n");
    }
    return 0;
}

fscanf の私のパターンでは、ファイルが次のようになっていることを前提としています。

(100,1.1,10)(200,2.2,20)(300,3.3,30)(400,4.4,40)

各セットは括弧で囲まれています。

于 2012-04-13T05:06:01.443 に答える