2
私はちょうどC + +で興味深い状況に遭遇しました。私は次のようなことをしていました:istream :: peek好奇心旺盛な行動。 EOF
istream in;
// ...
in.get(); // get a char (which turns out to be the last)
// curiously ios::eof bit doesn't get set just yet
c = in.peek(); // attempt to peek, return EOF and now set ios::eof bit
if(c == EOF) {
// realize shouldn't have gotten the last char for some reason
in.unget(): // attempt to unget, *fails* (because ios:eof bit was set)
}
私はなぜpeekがeofビットを設定するのか不思議です。私はこれが非常に直感的でないことがわかります。実際には何も消費していないので、ストリームの状態を変更しないでください。また、なぜunget
が後で動作しないのですか? good()
が偽である場合、標準ではすべての操作をノブにする必要がありますか?
あなたはその文字を
unget
したい場合は、ライン上で検索し、EOFに達したとき、ストリームの状態を自分でクリアする必要があります。私のように見える(間違って)、ストリームの現在の位置が終わり*であることを示すeofビットであると仮定した。あなたのコードはeofビットだけをクリアしません。また、 'EOF'を返す' peek'の後、 'unget'は意味を持ちません。 –@ジョヴァンニフンシャル:あなたのように感じて申し訳ありません。あなたの 'peek'がストリームから文字を取得できなかった場合(それ以上検索する必要がないため)、' unget'を実行するのはどのように意味がありますか?失うものは何もありません。ストリームから文字を取得できませんでした。ストリーム状態のクリアに関するあなたのコメントは...私はそれがなぜあなたにとって問題になるのか分かりません。 –
eof()フラグは、ストリームが最後の文字を超えて読み込もうとしたことを示します。最後の文字を読み取る前に、ストリームはそれが最後であることを知らない。このフラグは、読み取りが失敗した理由を検出するためにのみ有効です。ファイル全体を消費したためにエラーを報告したくない場合です。 –