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

3df52oht  于 2022-12-30  发布在  iOS
关注(0)|答案(1)|浏览(353)

我有一个简单的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.txt处的文件内容为Hello
程序能够读取内容,但失败,出现异常ios_base::failbit。在评估while (!(file.eof()))时似乎有问题。
出了什么问题?

qacovj5a

qacovj5a1#

问题是eof()不为真,直到您尝试读取超过文件结尾。
因此,一旦你正确读取了整个文件,并且文件中没有留下任何数据,eof()的结果仍然是false(因为你还没有读过末尾)。下一次读取将设置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;         
 }

相关问题