读取文件到结尾后为什么输入流对象失败?

时间:2016-10-03 18:00:41

标签: c++ ifstream

这是代码。 它给出了如下所示的EXACT输出意味着它正在读取文件。 但它也显示fails,因为您可以看到fin.fails()true。 我想知道为什么这是真的,虽然我成功地阅读了文件。

#include<fstream>
#include<iostream>
using namespace std;
int main()
{   ifstream fin;
    fin.open("pro.txt");
    char ch;
    int data;
    while(!fin.eof())//!(fin >> ch).eof()
    {
        fin.get(ch);
        cout<<ch;
        if(fin.fail()) {
            cout<<"fails";
        break;
        }
    }
    fin.clear();
    fin.seekg(0);
    int pos=(int)fin.tellg();
    cout<<"\n this is :"<<pos;
    fin.close();
    return 0;
}

Output is :
this is my name
fails
this is 0

Contents of pro.txt:
this is my name

不知道为什么会这样!

2 个答案:

答案 0 :(得分:0)

仍然无法找到为什么fin.fails()是真的,因为我认为没有人愿意 但我想出了在不fin.fails() = true的情况下阅读空格和文件。 只需将while(!fin.eof())替换为while(fin.get(ch)),然后移除身体中存在的fin.get(ch) - &gt;这就是为什么我的输出为每次读取跳过一个字符的原因..这是我在评论中提到的。

答案 1 :(得分:0)

问题如下:使用get读取文件中的最后一个字符会设置eofbit,因此请拨打fin.eof()在读取循环体内文件的最后一个字符后,while条件仍返回false。然后在读取最后一个字符之后的迭代期间,您尝试读取循环体内的另一个字符,即使没有字符可供读取。这会根据eofbit的{​​{3}}设置failbit get

TL; DR:读取文件末尾应该设置failbit