1

このような.txtファイルを解析する必要があります

autore: sempronio, caio; titolo: ; editore: ; luogo_pubblicazione: ; anno: 0; prestito: 0-1-1900; collocazione: ; descrizione_fisica: ; nota: ;

fscanfCコードで。通話中にいくつかのフォーマットを試しましたfscanfが、どれも機能しませんでした...

編集:

a = fscanf(fp, "autore: %s");

これは私が行った最初の試みです。'autore'、'titolo'、'editor' などのパターンは、 によって捕捉されてはなりませんfscanf()

4

2 に答える 2

2

一般的に言えば、 で入力を解析しようとするfscanfのは良い考えではありません。入力が期待と一致しない場合、正常に回復することは難しいからです。通常は、入力を内部バッファーに読み込み (freadまたはを使用fgets)、そこで解析することをお勧めします ( sscanf、などstrtokstrtol使用)。どの関数が最適かについての詳細は、入力形式の定義に依存します (入力形式の定義は提供されていません。入力例は、正式な仕様に代わるものではありません)。

于 2012-07-01T14:36:46.473 に答える
0

の使用方法を次に示しますstrtok

char* item;
char* input; // fill it with fgets

for (item = strtok(input, ";"); item != NULL; item = strtok(NULL, ";"))
{
    // item loops through the following:
    // "autore: sempronio, caio"
    // " titolo: "
    // " editore: "
    // ...
}

の使用方法を次に示しますsscanf

char tag[20];
int chars = -1;

if (sscanf(item, " %19[^:]: %n", tag, &chars) == 1 && chars >= 0)
{
    printf("%s is %s\n", tag, item + chars);
}

ここで、フォーマット文字列は次のもので構成されます。

  • (スペース) - パーサーに空白を破棄するように指示します
  • 19 - タグ内のバイト/文字の最大数
  • [^:] - パーサーに、コロン文字に出会うまで読み取るように指示します
  • : - コロン文字を破棄するようにパーサーに指示します
  • (空白) - 上記のように
  • %n - 読み取ったバイト数を報告するようにパーサーに指示します (&chars をチェック)

予期しない入力があった場合、文字数は更新されないため、-1各項目を解析する前に設定する必要があります。

于 2012-07-01T16:23:35.803 に答える