文件读取失败,并显示 ios_base::failbit

File read fails with ios_base::failbit

提问人:Kumar 提问时间:3/29/2016 最后编辑:BiffenKumar 更新时间:12/29/2022 访问量:1804

问:

我有一个简单的C++文件读取程序:

int main() {
    std::string buf;
    std::ifstream file;
    file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    try {
        file.open("C:\\Test11.txt");
        char c;
        while (!(file.eof())) {
            file.get(c);
            std::cout << c;         
        }
    }
    catch (std::ifstream::failure e) {
        std::cout << e.what() << std::endl;
        std::cout << e.code() << std::endl;
        std::cout << "Exception opening/reading file";
    }
    file.close();
    return 0;
}

文件的内容是 。C:\Test11.txtHello

程序能够读取内容,但因异常而失败。评估时似乎有问题。ios_base::failbitwhile (!(file.eof()))

出了什么问题?

C++ 文件 异常 ifstream eof

评论

0赞 Biffen 3/29/2016
stackoverflow.com/questions/5605125/......
0赞 Kumar 3/29/2016
@Biffen:谢谢!我现在明白了问题所在,但我找不到出路。因为仅在阅读之后,我们会遇到 EOF,并且在同一地方发生异常。我错过了什么吗?
0赞 Ulrich Eckhardt 3/29/2016
你想要什么确切的行为?
0赞 Kumar 3/29/2016
@UlrichEckhardt: 1) 我们想读取文件并将其显示在控制台上。2)如果出现任何错误,即。a) 文件不存在 b) 由于磁盘问题导致的读取问题,我们希望捕获异常并显示“打开/读取文件异常”
0赞 Ulrich Eckhardt 3/29/2016
您可以在布尔表达式中使用该文件来检查它是否已成功打开。您可以将一个流缓冲区的地址流式传输到另一个流中,以便在两个流之间复制数据。最终可以检查流是否达到 EOF,以区分成功和失败。

答:

2赞 Martin York 12/29/2022 #1

问题是,在您尝试读取文件末尾之前,这是不正确的。eof()

因此,一旦您正确读取了整个文件并且文件中没有剩余数据。的结果仍然是假的(因为你还没有读到最后)。下一次读取将设置,但下一次读取也将失败(从而引发异常)。eof()eof()

这就是为什么检查是一种反模式的原因。eof()

 while (!(file.eof()))
 {
     file.get(c);
     std::cout << c;         
 }

更好(正确)的模式是:

 while (file.get(c))   // reads next character into c returns a ref to file.
                       // Note: when a stream is used in a boolean context
                       //       such as an while () it is converted to bool
                       //       using !good(). Thus if the read fails
                       //       and the bad bit is set and the loop will exit.
 {
     std::cout << c;         
 }