代码之家  ›  专栏  ›  技术社区  ›  Bernard

当使用STD::FILEBUF时,检测底层文件的完整性丢失吗?

  •  2
  • Bernard  · 技术社区  · 7 年前

    我有一些代码 std::ifstream 从文件中读取,但不使用由提供的任何格式设置功能 STD::IFSH . 基本上是这样的:

    std::ifstream in;
    in.open("example.txt", std::ios_base::in | std::ios_base::binary);
    if (in.is_open()) {
        while (in.good()) {
            in.read(buffer, buffer_size);
            auto num_bytes = in.gcount();
            /* do stuff with the bytes */
        }
        in.close();
    }
    

    因为我直接处理文件中的原始字节,所以看起来更适合使用 std::filebuf 而不是 STD::IFSH :

    std::filebuf in;
    if (in.open("example.txt", std::ios_base::in | std::ios_base::binary) != nullptr) {
        while (true) {
            auto num_bytes = in.sgetn(buffer, buffer_size);
            /* do stuff with the bytes */
            if (num_bytes < buffer_size) break;
        }
        in.close();
    }
    

    从表面上看,这两个代码片段可能实现相同的结果。然而,在检查C++引用时, std::basic_istream::read() 说:

    如果内部操作引发异常,则捕获该异常并设置badbit。如果为badbit设置了exceptions(),则会重新引发异常。

    自从 badbit 用于表示基础文件由于某种原因损坏(可能操作系统无法再访问该文件),似乎 STD::IFSH 代码段将通过中断循环来处理这种可能性( good() 会回来的 false )

    然而, std::basic_streambuf::sgetn() 没有提到底层文件不可访问的可能性。它也没有提到任何异常被抛出的可能性(但它没有标记为 noexcept )

    使用时有什么方法吗 STD:FielBuf ,以便在文件过早无法访问(即尚未执行EOF)时正确处理该情况?(或者,我对文件I/O的理解可能是错误的?)

    1 回复  |  直到 7 年前
        1
  •  1
  •   catnip    7 年前

    std::filebuf 似乎根本没有任何形式的错误处理/报告。真可悲。我是说, 为什么不 ?

    所以,要使用它,唯一的选择就是回到原来的状态 errno ,并且自从进入 cppreference 一点也不提,我想你不能真的依赖它(尽管我相信,在实践中,它是有效的)。

    所以, std::ifstream 如果你能从这张庞大而有些晦涩的单子中找出例外位的作用,那就必须是前进的道路。当然,如果您这样做,您就可以控制是否抛出异常。

    同样,当出现问题时,没有明显的方法来检索任何类型的错误代码,因此,同样,如果您想尝试向用户呈现任何有意义的错误消息(或者为了技术支持的利益),那么 埃尔诺 是镇上唯一的游戏。

    这一切只会导致错误消息的扩散。大笑。