2012-09-27 8 views
6

C++では、std::ifstream open()が成功する場合がありますが、std::ifstream good()は間違っていますか?正常に開いていますが、うまくいきませんか?

EDIT:G ++ 4.7.1

#include <iostream> 
#include <fstream> 
int main(int argc, char *argv[]) 
{ 
    std::ifstream filestream("testfile"); 
    std::cout<<filestream.good()<<std::endl; 
    std::cout<<filestream.eof()<<std::endl; 
    std::cout<<filestream.fail()<<std::endl; 
    std::cout<<filestream.bad()<<std::endl; 
    return 0; 
} 

でテストが返されます:1、0、0、0をgood = TRUEeof = fail = bad = FALSEを意味空のファイルのため。それは普通ですか?

答えて

3

標準で実際のテキストを確認した後、私はeofbitopen後に設定することが許可されているとは思わない:実際のオープンが例外をスローした場合badbitを設定することができる(私は—標準が本当に言っていないと思いますこの場合にどうなるべきか)。オープンが失敗した場合、またはオープン後のシーク(ateが設定されている場合)が失敗した場合は、failbitを設定する必要があります。 eofbitが設定されている場合はありません。

この場合、std::istream::good()を呼び出すことは適切な解決策ではありません。 (OPを達成しようとしているかを知るために興味深いものになるだろう。それが何であれ、std::istream::good()はおそらく正しい解決策ではありません呼び出す。)

false戻りstd::ifstream::good()場合は、次の入力は失敗します。 trueを返すと、何も通知されません。次の入力が成功する可能性があります。 でも失敗する可能性があります。

+0

+1読み込みを試みて読み込みが失敗するまで、実装は実際にファイルをテストしないかもしれません。 –

+0

@DavidRodríguez-dribeas一般に、入力が失敗するまで、 'eofbit'をテストするのは意味がありません。 'std :: ifstream :: good()'が(他のステータスビットに加えて) 'eofbit'をテストするという事実は、それほど無価値です。 –

+0

質問者には「良い」を使って何らかの害がないとは思いませんか? 'eofbit'が設定されていないので、ストリームを正常のように真実をテストすることもできます。無意味な何かを行う際に読みやすさに危害が及ぶと思われます。あなたが言うように、「良い」の使用は全く無意味です... –

2

ファイルが空の場合、eofbitがトリガーされますが、ファイルはまだ開いています。

+0

:-)事実を報告する邪魔になるとは思いません操作がファイルの最後を過ぎて読み取ろうとする場合にのみ設定されます。それは間違っていますか? – templatetypedef

+0

@templatetypedefわかりません。ファイルが空であれば 'eofbit'を設定する必要はありませんが、許可されていないかどうかはわかりません。 'eofbit'がセットされていると、データがないので次の入力が失敗することになります。 (もし 'eofbit'が設定されていなければ、何も意味しません) –

+1

これは私の標準の読み方では間違っています。基礎となるファイルバッファの 'open()'が成功すると、ファイルストリーム内のすべてのステータスビットがクリアされます。ファイルバッファ 'open()'が失敗した場合、状態は 'failbit'に設定されます。いずれにしても、ファイルストリーム 'open()'の呼び出し後に 'eofbit'がクリアされます。 –

1

ifstream::openは無効ですので、「成功しました」と言うことに正確に注意してください。

エフェクト:

標準はbasic_ifstream::open(27.9.1.9)のために言うRDBUFを呼び出します() - >オープン(S、モード| ios_base ::で)。その関数 が戻らない場合はnullポインタを(クリア)呼び出し、たfilebufに開くための呼び出しが値を返す場合はそうでない場合は、だから、(ios_base投げるかもしれ::失敗) SETSTATE(failbit)

を呼び出します成功を示す場合、ifstream::openはすべてのエラービットをクリアしますので、good()は必ずtrueを返します。

filebufでopenを呼び出すと失敗を示す値が返された場合でも、ifstream::openは例外をスローせずに戻ります。この動作は「成功」と混同される可能性がありますが、この場合はフェイルビットが設定されているため、good()はfalseを返します。

私の理解ではeofbitがあるということでした、これはfailbitではなく、badbitをを設定し、なぜそれが私には完全には明らかではないのですが、私は理解の私の不足が