为了账号安全,请及时绑定邮箱和手机立即绑定

ifstream的eof()如何工作?

ifstream的eof()如何工作?

C++
30秒到达战场 2019-10-10 16:46:47
#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”?有人可以帮我解释一下吗?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

-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())  // 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.

}

这就是我们想要的。


查看完整回答
反对 回复 2019-10-10
?
ITMISS

TA贡献1871条经验 获得超8个赞

仅在读取操作尝试读取文件末尾之后才设置EOF标志。get()正在返回符号常量traits::eof()(恰好等于-1),因为它到达了文件的末尾并且无法再读取任何数据,并且只有在那时eof()才是true。如果要检查这种情况,可以执行以下操作:


int ch;

while ((ch = inf.get()) != EOF) {

    std::cout << static_cast<char>(ch) << "\n";

}


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 901 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信