【问题标题】:Is ios::in needed for ifstream's opened in binary mode?ifstream 以二进制模式打开是否需要 ios::in?
【发布时间】:2011-09-18 18:18:18
【问题描述】:

这两者有什么区别? in 标志对象不是多余的吗?谢谢。

std::ifstream file1("one.bin", std::ifstream::in | std::ifstream::binary);

std::ifstream file2("two.bin", std::ifstream::binary);

【问题讨论】:

  • erm... 来自文档我不认为这是多余的;值得花 30 秒...试试 :)
  • 为什么它是否是二进制的?

标签: c++ ifstream


【解决方案1】:

来自ifstream 类构造函数的文档:

binary(二进制)将流视为二进制而不是文本。
in(输入)允许对流进行输入操作。

因此,当从文件读取时,我会使用std::ifstream::in 标志,不是因为它是必需的(或不是),而是因为让编程接口知道您将使用它的目的是一种很好的编程实践。

编辑:
以下取自http://www.cplusplus.com/doc/tutorial/files/,虽然是关于open()成员函数(但问题中代码中的构造函数可能调用open()复制模式标志而不修改)。

类: 默认模式参数
ofstream: ios::out
ifstream: ios::in
fstream: ios::in | ios::out

对于 ifstream 和 ofstream 类,ios::in 和 ios::out 是 自动和分别假定,即使模式不 包含它们作为第二个参数传递给 open() 成员 功能。

尽管如此,Web 上的许多示例在显示ifstream 对象的构造时都使用ifstream::in。可能真的是某种迷信实践,而不是编程实践。

【讨论】:

  • @Naveen: 我需要让ifstream 知道我想用它来进行输入吗?我也可以使用普通的fstream——这就是我首先发布这个问题的原因。 :)
  • 是的,好点:P 我已经在编辑中变得更温和了。
  • 伙计们,不要再支持我的答案了,因为它并没有真正给出太多答案,只是表达了个人意见,并在open() 成员函数上提供了一些间接相关的信息。但是,这并不意味着我希望它被否决 =)
  • 好吧,如果 open() 发生这种情况,我认为假设构造函数也发生这种情况是合理的。
【解决方案2】:

binary,在这种情况下,仅指读取或写入的方法。在 Windows 上的常规模式下,'\n' 被转换为 '\r''\n'。这会影响读取和写入,因此二进制模式将其关闭。 out|binaryin|binary 一样有意义

【讨论】:

    【解决方案3】:

    我在网上找不到权威文档。

    编辑我什至在我的副本Josuttis Book 中找不到合适的参考,第 8 次印刷。 它应该在第 13.9 节 pp. 627-631

    经验证据表明这是多余的 IFF 没有通过 std::ios::in 或 std::ios:out:

    #include <fstream>
    #include <iostream>
    
    int main(int argc, char** args)
    {
        std::ifstream ifs(args[0], std::ios::binary);
        std::cout << ifs.rdbuf() << std::flush;
    
        return 0;
    }
    

    成功:

    test | md5sum
    md5sum test
    

    显示相同的哈希和。


        // ...
        std::ifstream ifs(args[0], std::ios::out | std::ios::binary);
    

    将失败(输出零字节)

    test | wc -c  # shows 0
    

    【讨论】:

      【解决方案4】:

      来自cplusplus.com reference page没有区别。

      in 始终为 ifstream 对象设置(即使在参数模式中明确未设置)。

      ofstream 也是如此。因此,您不需要为ifstream 设置std::ios::in 或为ofstream 设置std::ios::out,即使您设置了std::ios::binary,它省略了in/out 模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 2018-12-30
        相关资源
        最近更新 更多