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

すべての場合で、次のようになります。
最初の行:常にスペースで区切られた2つの単語。
2行目:数字

ここから、前の数と同じ数の行があり、各行には常に2つの単語があります。

ブロックごとに、ブロックで見つけたものを使用して計算したものを渡す関数を呼び出すことができるように、ファイルを解析するにはどうすればよいですか?

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

これを行うには多くの方法があります。私が考えた2つは次のとおりです。

ファイルがそれほど大きくない場合は、すべてを文字列のリスト(各行に1つの文字列)に読み込むことができます。

もう1つの方法は、ファイルハンドルと前のブロックを受け取る関数を渡すことです。

(Cで動的配列を書きたくない)

于 2013-02-23T18:28:00.653 に答える