ifstream检查读取错误

时间:2018-06-29 20:11:13

标签: c++11 ifstream

我找到了以下代码,用于将整个文件读取为字符串。不幸的是,我不知道如何正确检查整个文件内容是否已加载。有is_open函数,但是它不提供所有信息。感谢您的帮助!

std::ifstream file(fileName);
std::string content = std::string((
  std::istreambuf_iterator<char>(file)),
  std::istreambuf_iterator<char>());

2 个答案:

答案 0 :(得分:1)

您可以使用rdstate实用程序来检查(如果需要,可以重置)输入文件流的状态。

在您的程序中,它的工作原理如下:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream file("sample.txt");
    std::string content = std::string((
            std::istreambuf_iterator<char>(file)),
            std::istreambuf_iterator<char>());

    std::cout << "Reading status: " << file.rdstate() << std::endl;

    if (file.rdstate())
        std::cout << "Reading the file failed" << std::endl;

    return 0;
}

第一个输出用于演示-如果一切顺利,file.rdstate将为0。如果出了问题,它的值将是与系统有关的三个标志的总和。我建议您阅读引用的参考文献。

if语句是可以在程序中使用的实际检查。您也可以在其中添加异常引发,甚至用assert替换if-两种策略,以防万一您实际上希望程序在读取文件失败时停止。使用assert时,您可以将if替换为

assert(!file.rdstate());

并添加<cassert>标头。如果file.rdstate()的值为0(解释为false),则断言将引发并终止您的程序,因为您想要相反的选择-前面有一个否定项。

您只需指定一个不存在的文件名就可以轻松测试这些概念/想法,但是我也建议您this post获得更多的解释和测试思路,以澄清该概念。

答案 1 :(得分:0)

您正在寻找文件结尾或EOF标志。

End of file fliag