1

スー...このコードが別の質問に取り組んでいると主張する人を見ました。

while(scanf("%X", &hex) != EOF) {
    //perform a task with the hex value. 
}

では、どのコンテキストで EOF フラグがスローされるのでしょうか? 無期限に番号を要求し続けるだけだと思います。私はそれをテストするために別のコード行を追加しました.

これはファイルではなく、stdin のようです。だから....このコードはいつ役に立つのですか?
つまり、どのコンテキストで EOF リターンがスローされるのでしょうか?

4

3 に答える 3

1

のドキュメントを見ると、最初の値が割り当てられる前に読み取りエラーが発生した場合scanf、値が返されることがわかります。EOF(つまり、ファイルの終わり)

http://en.cppreference.com/w/cpp/io/c/fscanf

同様にテストできます:

while(scanf("%X", &hex) == 1)

これは私の好みです。私は 1 つの入力を期待しているので、明確にします。

于 2013-02-15T04:24:53.490 に答える
0

現実的に言えば、^d はストリームを終了し、「エラー」をスローするため、この入力は Linux で適切です。

Windowsでは、この動作は異なります...それが何であれ、ctrl + dではありません。少なくとも私は両方を使用しているので、今は知っています。

ありがとう!

于 2013-02-15T04:37:00.327 に答える
0

EOF I/O エラーおよびファイルの終わりで返されます。ではstdin、I/O エラーはまれなイベントであり、キーボード入力では通常、ファイルの終わりを示すには特別なキー シーケンスが必要です。

リダイレクトされた入力で実際に使用されます。

16 進テキストを読み取り、10 進テキストを出力するプログラムが存在すると仮定します。

// hex2dec.c
#include <stdio.h>    
int main(void) {
  unsigned hex;
  int cnt;
  while((cnt = scanf("%X", &hex)) == 1) {
    printf("%u\n", hex);
  }
  // At this point, `cnt` should be 0 or EOF
  if (cnt != EOF) {
    puts("Invalid hexadecimal sequence found.");
    return 1;
  }
  return 0;
}

// hex.txt contents:
abc
123

変換はコマンドで発生します

hex2dec < hex.txt
2748
291

で検出することによりEOFstdinプログラムは戻るタイミングを認識します。

于 2014-01-28T04:20:27.943 に答える