2

ファイルの内容が に渡されたフォーマット文字列と一致しない場合fscanf、次に ? を呼び出すとどうなりfscanfますか?

ファイルに次の 2 行が含まれているとします。

9000 pig dog
4 5 2

プログラムは、開いているファイル ( fp) を次のように解析しようとします。

int a = 1, b = 1, c = 1;
int x = 1, y = 1, z = 1;

fscanf(fp, "%d %d %d", &a, &b, &c);
fscanf(fp, "%d %d %d", &x, &y, &z);

これでwhileが保持され、値を保持し続けると思われaますが、 、、およびはどうなりますか?9000bc1xyz

C99標準は、 、 、および が値 、、および をそれぞれ保持することxを保証しますか?または、ファイル ストリームの位置インジケータは、解析に失敗した後も変更されないままであることが保証されており、その間に値を保持し、値を保持しますか?yz452x9000yz1

4

2 に答える 2

3

セクション 7.19.6.2

4)fscanf関数は、フォーマットの各ディレクティブを順番に実行します。以下に詳述するように、ディレクティブが失敗した場合、関数は戻ります。失敗は、入力の失敗 (エンコーディング エラーの発生または入力文字の使用不可による)、または一致の失敗 (不適切な入力による) として説明されます。

5) 空白文字で構成されたディレクティブは、入力を最初の非空白文字 (未読のまま) まで読み取るか、文字が読み取れなくなるまで実行されます。

9) 指定に指定子が含まれていない限り、入力項目はストリームから読み取られますn。入力項目は、指定されたフィールド幅を超えず、一致する入力シーケンスであるか、そのプレフィックスである入力文字の最長シーケンスとして定義されます。入力項目の後の最初の文字 (ある場合) は未読のままです。

そのaため、9000 になり、1 でbありc続けます。ストリームは まで読み取られます (ただし、含まれません) pig。そのため、2 番目の呼び出しの最初%dの呼び出しはすぐに失敗し、 1 のままxyなりzます。

于 2013-07-23T17:29:17.503 に答える
0

Plauger と Brodie による "Standard C" の私の便利なコピーから要約すると、fscanf() は次のように戻ります...

  • フォーマット文字列の終わり
  • ファイルのEOF
  • 変換失敗

会話の失敗については、明確に記載されていませんが、失敗したキャラクターはストリームに押し戻されると思います。したがって、「p」文字はストリームに表示されます。

fscanf() の戻り値は、一致した入力項目の数であることに注意してください。したがって、成功すると毎回 3 が返ってきます。あなたの例では 1 と 0 が返されると思います。

于 2013-07-23T17:25:35.317 に答える