ifstream的eof()如何工作?

#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”?有人可以帮我解释一下吗?


30秒到达战场
浏览 902回答 3
3回答

MM们

-1 get表示您已到达文件末尾。使用std::char_traits<char>::eof()(或std::istream::traits_type::eof())比较它-避免使用-1,这是一个神奇的数字。(尽管另一个有点冗长-您可以随时致电istream::eof)只有在读取尝试读取文件末尾之后才设置EOF标志。如果我有一个3字节的文件,而我只读取3个字节,则EOF为false,因为我还没有尝试读取文件末尾的内容。虽然这对于通常知道文件大小的文件来说似乎令人困惑,但是直到尝试在某些设备(例如管道和网络套接字)上进行读取时,才能知道EOF。第二个例子inf >> foo总是会返回inf,并带有尝试读取并将其存储在中的副作用foo。inf,在if或while将要评估true,如果该文件是“好”:没有错误,没有EOF。因此,当读取失败时,将其inf评估为false,并且循环将正确终止。但是,请考虑以下常见错误:while(!inf.eof())&nbsp; // EOF is false here{&nbsp; &nbsp; inf >> x;&nbsp; &nbsp; &nbsp; // read fails, EOF becomes true, x is not set&nbsp; &nbsp; // use x&nbsp; &nbsp; &nbsp; &nbsp;// we use x, despite our read failing.}但是,这:while(inf >> x)&nbsp; // Attempt read into x, return false if it fails{&nbsp; &nbsp; // will only be entered if read succeeded.}这就是我们想要的。

ITMISS

仅在读取操作尝试读取文件末尾之后才设置EOF标志。get()正在返回符号常量traits::eof()(恰好等于-1),因为它到达了文件的末尾并且无法再读取任何数据,并且只有在那时eof()才是true。如果要检查这种情况,可以执行以下操作:int ch;while ((ch = inf.get()) != EOF) {&nbsp; &nbsp; std::cout << static_cast<char>(ch) << "\n";}
打开App,查看更多内容
随时随地看视频慕课网APP