C++ 为什么要设置故障位。文件似乎印得很好

C++ 为什么要设置故障位。文件似乎印得很好,c++,C++,我有一段代码可以完成它想要做的工作,但我对failbit有怀疑。尽管文件显示在屏幕上,但catch块始终运行。当达到eof时,为什么设置故障位?也许我没有理解failbit的正确含义。有什么东西失败了吗 int main() { ifstream infile; char c; infile.exceptions ( ifstream::failbit ); try { in

我有一段代码可以完成它想要做的工作,但我对failbit有怀疑。尽管文件显示在屏幕上,但catch块始终运行。当达到eof时,为什么设置故障位?也许我没有理解failbit的正确含义。有什么东西失败了吗

    int main()
    {
        ifstream infile;
        char c;
        infile.exceptions ( ifstream::failbit );

        try
        {
            infile.open("../Dose.c", ios::in);
            while (!infile.eof())
            {   
                c=infile.get();
                cout << c;
            }
            infile.close();

        }
        catch(ifstream::failure e)
        {
            cout << infile.eof() << " " << infile.fail() << " " << infile.bad() << " " << infile.good() ; 
            cerr << " Exception opening/reading/closing file\n";
        }
    return 0;
    }
intmain()
{
河流充填;
字符c;
填充异常(ifstream::failbit);
尝试
{
填充开放(“../Dose.c”,ios::in);
而(!infle.eof())
{   
c=infle.get();
cout27.5.5.4,第7段:

布尔eof()常数; 返回:如果在rdstate()中设置了eofbit,则返回true

换句话说,eof()所做的只是检查eofbit是否已设置,而不是“主动”检查是否已到达文件末尾

跳过一堆枯燥、正式的规范,所发生的是在get()中检测到文件结束条件。首先设置eofbit,然后设置failbit(get()操作失败)。由于启用了异常,设置failbit的操作会引发异常。如果未启用异常,get()将返回traits::eof(),通常为-1,而不是从文件中读取的字符

外卖:

  • 使用异常时,eof()的唯一值出现在已引发异常之后,以确定异常是否由文件结束条件引起。在您的示例中,eof()永远不会返回true
  • 当不使用异常时,实际上并不需要eof(),只需检查get()是否返回-1即可

  • FWIW,
    ios::in
    是不必要的,循环应该是
    while(infle.get(c)){是什么让你认为eof在失败之前就已经到达了?我只是想用try-catch块打开文件。这就是我的意图。这样,当文件不存在或打开时出现错误时,我可以做一些异常处理。你所要做的就是使用_-open()检查文件是否成功打开。