我想读取一个包含样本编号,值和状态(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;
}
但是,我得到一个错误说,“请求成员而不是结构”......
答案 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)
每个集都括在括号中。