0

我有一个具有以下格式的文件:

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

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

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

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

4

2 回答 2

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;
}
于 2013-02-23T18:45:20.953 回答
0

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

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

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

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

于 2013-02-23T18:28:00.653 回答