【问题标题】:Parsing a file in C with several similar blocks用几个相似的块在 C 中解析一个文件
【发布时间】:2013-02-23 18:20:25
【问题描述】:

我有一个格式如下的文件:

abc dca
2
aa bb
casca casss

abc dca
3
aa bb
casca casss
casca casss

abcd abcd
0

基本上它是按块进行的(在前面的示例中将有 3 个块)。一个特定的块是:

abc dca
2
aa bb
casca casss

在所有情况下,我们都会:
第一行:总是两个单词,用空格隔开。
第二行:一个数字

从这里开始,我们将有与前一个数字一样多的行,并且每行总是有两个单词。

如何解析文件,以便对于每个块我可以调用一个函数,传递一些我用我在块中找到的东西计算的东西?

【问题讨论】:

    标签: c file parsing


    【解决方案1】:

    使用最小状态机:

    #include <stdio.h>
    #include <string.h>
    
    int main(int qrgc, char **argv)
    {
    char buff[111];
    char one[10], two[10];
    char left[10], right[10];
    int num;
    size_t len;
    int state,rc;
    
    state =0;
    
    while(fgets (buff, sizeof buff, stdin)) {
            len = strlen (buff);
            while (len && buff[len-1] == '\n') buff[--len] = 0;
            switch (state) {
            case 0:
                    rc = sscanf(buff, "%s %s", left, right);
                    if (rc < 2) goto quit;
                    state=1;
                    break;
            case 1:
                    rc = sscanf(buff, "%d", &num);
                    if (rc < 1) goto quit;
                    state=2;
                    break;
            default:
                    if (!len) {state = 0; continue; }
                    rc = sscanf(buff, "%s %s", one, two);
                    if (rc < 2) goto quit;
                    break;
                    }
            }
    quit: ;
    return 0;
    }
    

    【讨论】:

    • wildplasser 这是一个非常好的方法。但是,我有一个疑问。对于每个块,我需要调用一个函数并传递我找到的参数(第一行单词和整数之后的单词)。通过做一个状态机,我真的不知道我在哪个块中是对的?我怎么能解决这个问题?我的意思是,假设对于第一个块,我会调用这样的函数 doLogic(abc,dca,mapping_rules);其中 mapping_rules 是一个包含起源和命运的结构数组。第一行的起源是 aa 和命运 bb,第二行是 casca 和 cass。
    • 是的,这只是一个骨架。您需要添加实际的有效负载:分配节点、重新分配数组等。可以在子函数中完成,但如果它很小,也可以添加到案例块中。
    • 我知道这是一个骨架 :) 我只是看不到在什么时候我会调用我的函数。现在我已经完成了一个区块,我该怎么办?
    • 尝试理解状态机。当它从 state=2-->>state=0 切换回来时,它完成了一个块。如果它是一个函数,您可以从那里返回一条记录(:= 2+N 行),随后的调用将从 state=0 开始,并返回下一条记录(如果有)。
    • wildplasser,如果在案例 1 的状态下我想初始化一个 num 大小的数组,并且我想在默认情况下使用该数组,我该怎么做?或者换句话说,我如何在状态之间传递变量?
    【解决方案2】:

    有很多方法可以做到这一点。我想到的两个是:

    如果文件不是很大,则可以将其全部读入字符串列表(每行一个字符串)。

    另一种方法是通过创建一个接收文件句柄和前一个块的函数。

    (我不想用 C 写动态数组)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2013-07-29
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多