如果我打开了如下文件:
ofstream file("file.dat",ios::binary);
或
ofstream file("file.dat",ios::binary | ios::out);
如何处理以后一种形式打开的文件,我无法使用前一种形式,反之亦然
谢谢
答案 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::in
和ios::out
),并将它们映射到C fopen()
参数。根据标准,如果在打开的文件中没有指定修饰符,则打开失败。
在27.8.1.9中,我们发现ofstream
的工作方式与此类似,但会自动指定ios::out
。因此,原始问题的答案是两者都将完全相同。
我不知道为什么人们在没有fstream
或ios::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: 没有默认值,您必须明确确定要执行的操作。否则,没有编译错误,但你没有得到你想要的东西。
至于原始问题,两者的工作方式完全相同!