6

私は C++ を使用していますが、ログ ファイルの行を .xml で解析することにしましたsscanf。各行を読み取った後、データを抽出して変数に保存する必要があります。

string test = "[06/03/2013 18:15:23] INFO - Open [Johny Cage]";

int day, month, year, second, minute, hour;
char name[128];

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^\n]%c]",
               &day, &month, &year, &second, &minute, &hour, name);

if (c == 7)
{
    cout << name << endl;
}

Johny Cage名前を(名前にはスペースが含まれている可能性があります)として読み取り、に保存する必要nameがありますが、出力は次のとおりです。

ジョニー・ケイジ】

問題は末尾の]. sscanfwhich it not read lastを使用するにはどうすればよい]ですか?

4

3 に答える 3

7

[^]]の代わりに使用し[^\n]ます。また、%cスキャン形式文字列の末尾を削除します。

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]",
               &day, &month, &year, &second, &minute, &year, name);
于 2013-03-06T19:50:14.757 に答える
3

それに対してチェックすることによって。これを試して:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^\]\n]]%*[^\n]\n",
           &day, &month, &year, &second, &minute, &year, name);

] はエスケープする必要があります。そうしないと、「区切り文字列の終わり」として理解され、空になるため、不正になります。

この追加により、最初に発生したものは何でも、改行または ] で停止します。

そしてもちろん、その %c を削除します...結局のところ、変数に保存しません。

最後の追加は、見つかった次の改行文字まで読み取り、途中で見つかった記号 (つまり *) を破棄します。

于 2013-03-06T19:47:43.383 に答える
1

あなたが名前を一致させる方法で何が起こっているのかわかりませんが、これは私にとってはうまくいきます:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"

これは、終了ブラケット以外のすべてに一致します。

于 2013-03-06T19:56:53.790 に答える