ifstream 检查读取错误

ifstream checking read error

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

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

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

End of file fliag

您可以使用 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 语句是您可以在程序中使用的实际检查。您也可以在其中添加异常抛出,甚至可以将 if 替换为 assert - 这两种策略都适用于您实际上希望程序在读取文件失败时停止的情况。使用断言时,您可以将 if 替换为

assert(!file.rdstate());

并添加 <cassert> header。如果 file.rdstate() 值为 0(解释为 false),Assert 将抛出并终止您的程序,因为您想要相反的结果 - 预先有一个否定。

您只需指定 non-existent 文件名即可轻松测试这些 concepts/idea,但我还建议您 this post 获得更多解释和测试想法,以阐明概念。