7

C++ では、std::ifstream open()成功してstd::ifstream good()も false になるケースはありますか?

編集: 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. 正常ですか?

4

3 に答える 3

3

標準の実際のテキストを確認した後、実際のオープンで例外がスローされた場合、 :eofbitの後に設定することは許可されていないと思います (私が思うに、この場合に何が起こるべきかは標準では実際には述べられていません)。 ; オープンが失敗した場合、またはオープン後のシーク (設定されている場合) が失敗した場合に設定する必要があります。しかし、設定できるケースはないようです。openbadbitfailbitateeofbit

この場合、呼び出しstd::istream::good()が良い解決策であるとは限りません。(OP が何を達成しようとしているのかを知ることは興味深いでしょう。それが何であれ、呼び出しstd::istream::good()はおそらく正しい解決策ではありません。)

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

于 2012-09-27T16:58:27.977 に答える
2

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

于 2012-09-27T16:57:06.207 に答える
1

ifstream::openvoid を返すため、「成功した」と言う意味に注意してください。

標準はbasic_ifstream::open(27.9.1.9) について次のように述べています。

効果: rdbuf()->open(s, mode | ios_base::in) を呼び出します。その関数が null ポインターを返さない場合は clear() を呼び出し、それ以外の場合は setstate(failbit) を呼び出します (ios_base::failure をスローする可能性があります)。

そのため、filebuf での open の呼び出しが成功を示す値を返した場合、ifstream::openすべてのエラー ビットがクリアされるため、good()必ず true が返されます。

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

これがバッドビットではなくフェイルビットを設定する理由は完全には明らかではありませんが、私の理解不足が事実の報告の妨げになるとは思いません:-)

于 2012-09-27T17:12:03.997 に答える