在 ifstream 中以二进制模式打开文件,是否需要使用 ios::in?

8
这两个有什么区别?in标志对象的作用是不是多余的?谢谢。 std::ifstream file1("one.bin", std::ifstream::in | std::ifstream::binary); std::ifstream file2("two.bin", std::ifstream::binary);

2
从文档中看,我不认为它是多余的;而且尝试一下也值得花30秒钟的时间 :) - sehe
它是二进制还是其他格式,这有什么关联吗? - Daniel
4个回答

5
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类,即使将不包含它们的模式作为第二个参数传递给open()成员函数,也会自动分别假定ios::in和ios::out。

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

2
@ Naveen:我需要让 ifstream 知道我要用它来进行输入吗?我同样可以使用普通的 fstream,这也是我首先发布这个问题的原因。 :) - catfish_deluxe_call_me_cd
是的,说得好 :P 我在编辑中已经对它变得更加柔和了。 - Desmond Hume
1
各位,不要再给我的答案点赞了,因为它并没有真正给出太多答案,只是表达了个人观点,并提供了一些间接相关的open()成员函数信息。然而,这并不意味着我希望它被踩 =) - Desmond Hume
如果open()发生了这种情况,我认为可以合理地假设构造函数也会发生这种情况。 - catfish_deluxe_call_me_cd

2

二进制,在这种情况下,仅指读取或写入数据的方法。在Windows的常规模式下,'\n'会被转换为'\r''\n'。这可能会影响读写双方,因此二进制模式关闭了该功能。out|binaryin|binary同样有意义。


1

我找不到在线权威的文档。

编辑 我在Josuttis Book第8版中也找不到适当的参考资料。 它应该在第13.9节第627-631页中

经验证据表明,如果没有传递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

0

来自cplusplus.com参考页面没有区别。

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

对于ofstream也是一样的。因此,您不需要为ifstream设置std::ios::in或为ofstream设置std::ios::out,即使您已经设置了省略in/out模式的std::ios::binary


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接