2014-04-07 3 views
1

그래서 루프에서 구조체 배열로 값을 읽으려고합니다. 파일에는 특정 알고있는 입력이 있으므로 각각의 값을 구조체 배열의 특정 슬롯에 할당하려고합니다. 그러나, 그것을 실행하려고 할 때마다, 나는 루프의 라인에서 'ROW 전에 예상 된 표현'이라고 들었다.오류 파일의 값을 구조체 배열로 읽어들입니다.

typedef struct information 
{ 
char Poke[100]; 
char Type[100]; 
char Evo[100]; 
float Height; 
float Weight; 
int HP; 
int Attack; 
int Defense; 
int SPA; 
int SPD; 
int Speed; 
} ROW[100]; 

int main() 
{ 
    int i; 
    FILE *ifp; 
    //open file, set to ifp 

    while(!feof(ifp)) 
    { 
    j++; 
    //Read and store all values 
    fscanf(ifp, "%s %s", ROW[j].Poke, ROW[j].Type); 
    fscanf(ifp, "%f %f", ROW[j].Height, ROW[j].Weight); 
    fscanf(ifp, "%i %i %i %i %i %i", &ROW[j].HP, &ROW[j].Attack, 
     &ROW[j].Defense,&ROW[j].SPA,&ROW[j].SPD,&ROW[j].Speed); 
    fscanf(ifp, "%s", &ROW[j].Evo[0]); 
    } 
} 
+0

'typedef'를 잃습니다. [그리고 while (! feof (ifp))]에서 버그를 수정하십시오. (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong/5432517#5432517) – WhozCraig

답변

3

구조체를 정의하고 그와 같은 식으로 배열을 선언 할 수 없습니다. 다음과 같이 두 개를 분할해야합니다.

typedef struct information 
{ 
    char Poke[100]; 
    char Type[100]; 
    char Evo[100]; 
    float Height; 
    float Weight; 
    int HP; 
    int Attack; 
    int Defense; 
    int SPA; 
    int SPD; 
    int Speed; 
} ROW; 

ROW rows[100]; 

그런 다음 루프에 rows을 사용하십시오.

1

Andrew Medico의 답변에 추가. 더 나은 루프 구조는 다음과 같습니다.

for (j = 0;;) 
{ 
    ROW row; 
    int n_items = fscanf(ifp, "%100s %100s %f %f......", 
     row.Poke, row.Type, &row.Height, &row.Weight, ......); 

    if (n_items == 11) 
     rows[j++] = row; 
    else 
     break; 
} 
// at this point, the number of valid rows is j 

또 다른 요점은이 루프 구조가 입력에 오타가있는 경우를 정상적으로 처리 할 수 ​​없다는 것입니다. 으로 fscanf 라인을 대체 할 더 나은 것 :

char buffer[400]; // longer than the longest line 
if (! fgets(buffer, sizeof buffer, ifp)) 
    break; 

int n_items = sscanf(buffer, "%100s........... 

이 디자인은 당신이 sscanf을하기 전에 라인에 몇 가지 검사를 수행 할 수 있음을 더 유연하다. 예를 들어, 행 시작 부분에 # 문자가 있으면 행을 건너 뛸 수 있음을 나타낼 수 있습니다.

관련 문제