如何将struct数组传递给函数并在其中正确存储值?

时间:2012-04-13 04:08:14

标签: c

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

#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;
}

但是,我得到一个错误说,“请求成员而不是结构”......

3 个答案:

答案 0 :(得分: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]),但我喜欢后者,因为我觉得它更具可读性。

答案 1 :(得分:0)

struct Data_point * a是你的函数arugument,你传递数据是一个数组。所以基本上你试图从一个不是结构的数组中获取成员。

可能是

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

int filldata( struct Data_point a,...) //as you are using a.

答案 2 :(得分: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)

每个集都括在括号中。