1. ホーム
  2. c++

[解決済み] ifstreamのeof()はどのように動作するのですか?

2022-03-02 22:02:31

質問

#include <iostream>
#include <fstream>

int main() {
    std::fstream inf( "ex.txt", std::ios::in );
    while( !inf.eof() ) {
        std::cout << inf.get() << "\n";
    }
    inf.close();
    inf.clear();
    inf.open( "ex.txt", std::ios::in );
    char c;
    while( inf >> c ) {
        std::cout << c << "\n";
    }
    return 0;
}

について、本当に迷っているんです。 eof() 関数を使用します。例えば、私のex.txtの内容がそうだったとします。

abc

常に余分な文字を読み込んで表示します。 -1 を使用して読み取る場合 eof() . しかし inf >> c は正しい出力である'abc'を出力したのでしょうか?誰かこれを説明するのを手伝ってくれませんか?

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

-1は get は、ファイルの末尾に到達したことを示す方法です。これを std::char_traits<char>::eof() (または std::istream::traits_type::eof() ) - 1は避けてください、これはマジックナンバーです。(もうひとつは少し冗長ですが、いつでも istream::eof )

EOF フラグが設定されるのは、一度でも読み込みが行われたときだけです。 ファイルの終端を越えて . もし3バイトのファイルがあって、3バイトしか読まなかった場合、EOFは false というのも、まだファイルの最後を読もうとしていないからです。これは、通常サイズを知っているファイルでは混乱するようですが、パイプやネットワークソケットのようなデバイスでは、読み取りが行われるまでEOFはわかりません。

2番目の例は、次のように動作します。 inf >> foo は常に inf に格納しようとする副作用があります。 foo . inf である。 if または while と評価されます。 true もしファイルがエラーもEOFもない良好なものであれば、quot;good" となります。したがって、読み込みに失敗すると inf に進化します。 false となり、ループは正しく終了します。しかし、このようなよくあるエラーを考えてみましょう。

while(!inf.eof())  // EOF is false here
{
    inf >> x;      // read fails, EOF becomes true, x is not set
    // use x       // we use x, despite our read failing.
}

ところが、これ。

while(inf >> x)  // Attempt read into x, return false if it fails
{
    // will only be entered if read succeeded.
}

というのは、私たちが望んでいることです。