0

我想读取一个包含样本编号、值和状态(1.1、23,0)的文件。我使用 Struct 来保存该信息。我将传递函数结构数组和文件位置。

#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

一个问题是,filldata()它采用了一个指针参数。所以你->用来称呼成员而不是“。”。例如a.sampleNumber应该如此。a->sampleNumber

另一个问题是filldata()读取单个结构,但您将指针传递给数组顶部,这与&(data[0]). 所以如果你重复调用它(你没有),这个函数只会覆盖第一个元素。如果您在循环中调用它,则需要将其传递给指向各个数组成员的指针:

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

您实际上可以data + i用作第一个 arg 而不是,&(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”参数传入的数组有多长。它将返回成功填写的条目数。

IE

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 回答