2012-04-13 9 views
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; 
} 

, 나는 오류가

+0

오류 메시지는 정확히 무엇을 말하고 문제가있는 줄을 나타냅니다. –

+1

감사합니다. 이미 해결 방법을 알고 있는지 물어 보지 않았습니다. –

+1

읽어 보셨습니까? "회원"이 무엇인지 아십니까? –

답변

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])의 첫 번째 인수로 data + i을 사용할 수 있지만, 내가 발견하면 후자를 좋아한다 : 당신은 루프를 호출하는 경우에는 각 배열 구성원에 대한 포인터에 합격해야합니다 더 읽기 쉽습니다.

+1

하지만 fscanf를 사용하고 있으므로 주소를 사용해야한다고 생각하십니까? a-> xxx는 xxx 회원의 값입니까? 예, 방금 지금은 단일 구조체를 시도하고 있습니다 –

+1

죄송합니다. scanf에 args로'& (a-> xxx)'를 전달해야합니다. –

+0

하지만 의미가 없습니다. 작동하지 않습니다. & (a-> xxx)는 & (* a.xxx) –

0

구조체 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. 
+0

구조체의 멤버를 처리하는 방법은 화살표 연산자 ('->')입니다. 나는 당신이'filldata (data [i], ...) '로 무엇을하고 있는지 잘 모르고있다. 'data' 배열을 처리한다는 의미였습니까? – Makoto

+0

배열 자체에 주소 정보가 포함되어 있지 않습니까? 그래서 배열 주소의 첫 번째 요소 인 데이터를 전달 오전 –

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"매개 변수가 전달되는 배열의 길이를 알려 주어야합니다. 성공적으로 채워진 항목의 수를 반환합니다.

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

각 세트는 괄호로 묶여 :

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 내 패턴 파일이처럼 될 것으로 기대하고있다.

관련 문제