2016-10-26 3 views
0

섹션의 파일 내용을 사용 가능한 구조체로 읽으려고 시도하는 중 '#'기호가 섹션을 시작하는 동안 '. 기호는 그것을 끝냅니다.섹션에서 파일 내용 읽기

# Type name 
bird 
mammal 
. 
# Type effectiveness 
VeryEffective 
NotEffective 
. 

지금까지 내가 첫 번째 유형의 내용을 읽을 수 있지만 나는 두 번째의 내용을 읽을 때, 나는 다시 읽는 첫 번째의 내용을 유지 : 예는 것입니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    typedef struct 
    { 
     char types[1000]; 
     char effectiveness[1000]; 
    } sinFile; 
    sinFile record[1000]; 

    FILE* file; 
    char line[121]; 
    char period[10]; 
    char Type2[20]; 


    char* item; 
    char* item2; 
    int i = 0; 
    int j; 


    file = fopen("Test3.txt", "r"); 

    while(fgets(line, 120, file)) { 
     item = strtok(line, " "); 
     strcpy(period, "."); 
     strcpy(Type2, "# Type effectiveness"); 

     if (item[0] == '#' || item[0] == '.') { 
      continue; 
     } else { 
      do { 
       strcpy(record[i].types, line); 
       i++; 
      } while (strcmp(record[i].types, period) == 0); 
     } 


     for(j=0; strcmp(line, Type2) == 0; j++) { 
      do { 
       strcpy(record[j].effectiveness, line); 
       j++; 
      } while (strcmp(record[j].effectiveness, period)== 0); 
     } 
    } 

    fclose(file); 

    printf("%s", record[1].effectiveness); 
} 

현재 [1] .types 레코드는 [1] .effectiveness 레코드와 동일한 결과를 제공합니다. 즉 '포유 동물'. 나는 가까이에있는 것처럼 느껴진다. 그러나 나는 어떻게 나아갈 지 모른다.

+0

Fyi, ""유형 유효성 "은 ** 21 ** ** 종결자를 포함한 넓은 문자입니다. 'Type2' 배열을 위반하고 있습니다. – WhozCraig

+0

파일에 항상 한 줄에 한 단어 씩 있습니까? – RoadRunner

+0

테스트를 위해 파일을 단순화했지만 '# 유형 유효성'의 내용 만 두 단어 이상을 포함합니다. – burnsieXD

답변

0

이 코드에는 많은 문제가 있습니다. 이것을 얻기 위해서는이 샘플을 사용해야합니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    typedef struct 
    { 
     char types[1000]; 
     char effectiveness[1000]; 
    } sinFile; 

    sinFile record[1000]; 

    FILE* file; 
    char line[121]; 
    char* bp; 
    int i=0, j=0; 
    int state=0; 

    file = fopen("Test3.txt", "r"); 

    while(fgets(line, 120, file)) { 
     for(bp=line;isspace(*bp);bp++); 
     if(state==0) { 
      if(*bp=='#') { 
       for(bp=line;isspace(*bp);bp++); 
       item = bp; 
       if(!strcmp(item,"Type name")) state=1; 
       else if(!strcmp(item,"Type effectiveness")) state=2; 
      } 
     } 
     else { 
      if(*bp=='.') { 
       state=0; 
      } 
      else if(state==1) { 
       strcpy(record[i].types, bp); 
       i++; 
      } 
      else if(state==2) { 
       strcpy(record[j].effectiveness, bp); 
       j++; 
      } 
     } 
    } 

    fclose(file); 

    printf("%s", record[1].effectiveness); 
} 

그러나이 코드

, 1 블록의 선 ... 블록하지 않고 키/값 쌍을 사용하는 것이 더 간단 할 것 2 블록의 라인과 일치해야합니다.