在C ++文件中:作为ios :: binary打开的文件与以ios :: binary |打开的文件不同IOS ::出来?

时间:2010-02-09 17:41:10

标签: c++ fstream

如果我打开了如下文件:

ofstream file("file.dat",ios::binary);

ofstream file("file.dat",ios::binary | ios::out);

如何处理以后一种形式打开的文件,我无法使用前一种形式,反之亦然

谢谢

4 个答案:

答案 0 :(得分:5)

对于ofstream,ios::out是默认值,因此没有区别。我相信唯一一次指定ios :: out会产生影响,如果你使用的是一个可以打开读取或写入的fstream,或两者兼而有之。

答案 1 :(得分:2)

在大多数情况下,我希望没有区别,虽然看起来技术上可能是特定于实现的。

在我的实现(gcc 3.4.3)中,forstream的open在ofstream-> open()调用中使用ios ::: out模式,无论通过构造函数指定什么,所以它纯粹是可选的。如果使用fstream,则不是这种情况,需要明确指定。

答案 2 :(得分:2)

签出标准,第27.8.1.3节讨论了各种ios修饰符(如ios::inios::out),并将它们映射到C fopen()参数。根据标准,如果在打开的文件中没有指定修饰符,则打开失败。

在27.8.1.9中,我们发现ofstream的工作方式与此类似,但会自动指定ios::out。因此,原始问题的答案是两者都将完全相同。

我不知道为什么人们在没有fstreamios::in的情况下发现ios::out开放,但我对标准的阅读说它不应该有效。我对其他人对27.8.1.3的阅读感兴趣。

答案 3 :(得分:1)

感谢所有回答我的人: 我现在根据我的答案测试了几个代码并提出了这个总结:

使用ofstream: 即使没有指定任何内容,ios :: out也是默认值,但是如果你只使用ios :: in with ofstream,没有编译错误(除非你使用read()或>>或者某些ifstream对象)但没有文件会写入。

使用ifstream: 即使没有指定任何东西,ios :: in也是默认值,但是如果你只使用ifos的ios :: out,没有编译错误(除非你使用write()或<<或某些stream对象)但你不能从文件中读取任何信息。

使用fstream: 没有默认值,您必须明确确定要执行的操作。否则,没有编译错误,但你没有得到你想要的东西。

至于原始问题,两者的工作方式完全相同!