逐节阅读文件内容

时间:2016-10-26 12:09:33

标签: c file data-structures struct

我试图将文件内容分段读入可用的结构,'#'符号开始一段而''。符号结束了它。一个例子是:

# 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]相同的结果。效果;即'哺乳动物'。我觉得我很接近,但我不知道该怎么办。

1 个答案:

答案 0 :(得分: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);
}

但是使用这个代码,第一个块中的行必须与第二个块中的行对应...使用没有块的键/值对会更简单。