2016-10-26 8 views
0

セクション内のファイルの内容を使用可能な構造体に読み込もうとしていますが、 '#'記号はセクションを開始し、 '。'記号はそれを終わらせる。例は次のようになります。セクションでファイルの内容を読む

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

これまでのところ、私は第一のタイプの内容を読み取ることができますが、私は2番目の内容を読み取るしようとしたとき、私は最初の再読み込みの内容に保ちます。

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

現在、record [1] .typesはrecord [1] .effectivenessと同じ結果を返します。すなわち「哺乳動物」である。私は近くにいるように感じますが、どのように進むべきかわかりません。

+0

Fyi、「#タイプ有効性」は、** 21 ** **の文字数で、ターミネータを含みます。 'Type2'配列に違反しています。 – WhozCraig

+0

ファイルには常に1行に1語がありますか? – RoadRunner

+0

テストするために、私はファイルを簡略化しましたが、 '#Type effective'の内容だけが複数の単語を含んでいます。 – 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); 
} 

しかし、このコードで、第一ブロック内の行は、第二ブロック内の行に対応しなければならない...ブロックせずに、キー/値のペアを使用する方が簡単だろう。

関連する問題