1. ホーム
  2. c++

[解決済み] iostream::eof がループ条件の中 (つまり `while (!stream.eof())`) にあるのはなぜいけないとされているのでしょうか?

2022-03-15 21:52:39

質問

のコメントを発見しました。 これ の回答では iostream::eof をループ条件とすることは、ほぼ間違いです。私は通常、次のようなものを使用します。 while(cin>>n) - これは暗黙のうちにEOFをチェックしているのでしょう。

を使用して明示的に eof をチェックするのはなぜですか? while (!cin.eof()) は間違っているのでしょうか?

を使うのとはどう違うのでしょうか? scanf("...",...)!=EOF をC言語(私はよく問題なく使っています)で使うことはできますか?

どのように解決するのですか?

なぜなら iostream::eof を返すだけです。 true ストリームの終端を読み取る。それは次のようになります。 ない は、次の読み込みがストリームの終わりになることを示しています。

次の読み出しがストリームの終わりになると仮定して)考えてみてください。

while(!inStream.eof()){
  int data;
  // yay, not end of stream yet, now read ...
  inStream >> data;
  // oh crap, now we read the end and *only* now the eof bit will be set (as well as the fail bit)
  // do stuff with (now uninitialized) data
}

これに対して

int data;
while(inStream >> data){
  // when we land here, we can be sure that the read was successful.
  // if it wasn't, the returned stream from operator>> would be converted to false
  // and the loop wouldn't even be entered
  // do stuff with correctly initialized data (hopefully)
}

そして、2つ目の質問について。なぜなら

if(scanf("...",...)!=EOF)

と同じです。

if(!(inStream >> data).eof())

そして ない と同じです。

if(!inStream.eof())
    inFile >> data