2012-01-06 11 views
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()が偽である場合、標準ではすべての操作をノブにする必要がありますか?

答えて

4
in.get();  // get a char (which turns out to be the last) 
       // curiously ios::eof bit doesn't get set just yet 

これは "好奇心" ではありません。ストリームのEOFビットは、がeofに達したために失敗したときにセットされます。それはではありません "最後の読書は私たちをeofに連れて行きました"。今のように

c = in.peek(); // attempt to peek, return EOF and now set ios::eof bit 

また、なぜungetが機能しないのですか? good()が偽である場合、標準ではすべての操作をノブにする必要がありますか?

...これは起こっていることです。そうでなければ "うまくいきません"を定義することに失敗しました。

あなたは、あなたの答えは一種の複雑と私には不明である3.

istream in; 
// ... 
in.get();  // assume this succeeds (*) 

c = in.peek(); // assume this fails and sets EOF bit 

if (!in) { 
    in.clear(); // clear stream error state for use 
    in.unget(); // "put back" that character (*) 
} 
else { 
    // next char from .get() will be equal to `c` 
} 
+0

あなたはその文字をungetしたい場合は、ライン上で検索し、EOFに達したとき、ストリームの状態を自分でクリアする必要があります。私のように見える(間違って)、ストリームの現在の位置が終わり*であることを示すeofビットであると仮定した。あなたのコードはeofビットだけをクリアしません。また、 'EOF'を返す' peek'の後、 'unget'は意味を持ちません。 –

+0

@ジョヴァンニフンシャル:あなたのように感じて申し訳ありません。あなたの 'peek'がストリームから文字を取得できなかった場合(それ以上検索する必要がないため)、' unget'を実行するのはどのように意味がありますか?失うものは何もありません。ストリームから文字を取得できませんでした。ストリーム状態のクリアに関するあなたのコメントは...私はそれがなぜあなたにとって問題になるのか分かりません。 –

+3

eof()フラグは、ストリームが最後の文字を超えて読み込もうとしたことを示します。最後の文字を読み取る前に、ストリームはそれが最後であることを知らない。このフラグは、読み取りが失敗した理由を検出するためにのみ有効です。ファイル全体を消費したためにエラーを報告したくない場合です。 –

関連する問題