ifstream以二进制模式打开是否需要ios ::?

时间:2011-09-18 18:18:18

标签: c++ ifstream

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

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

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

4 个答案:

答案 0 :(得分:5)

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

  

二进制(二进制)将流视为二进制而不是文本    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是   自动并分别假设,即使模式没有   include include作为第二个参数传递给open()成员   功能

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

答案 1 :(得分:2)

在这种情况下,

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

一样有意义

答案 2 :(得分:1)

我无法在线找到权威文档。

修改我甚至无法在我的副本Josuttis Book,第8次打印中找到合适的参考。 应该在第13.9页第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

答案 3 :(得分:0)

cplusplus.com reference page开始,没有区别。

<块引用>

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

ofstream 也是如此。因此,您无需为 std::ios::in 设置 ifstream 或为 std::ios::out 设置 ofstream,即使您已设置 std::ios::binary 省略了 {{1} } 模式。