5

如果我打开一个像这样的文件:

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

或者

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

我可以用后一种形式打开的文件做什么,而我不能用前一种形式做,反之亦然

谢谢你

4

4 回答 4

5

对于一个ofstream,ios::out是默认的,所以没有区别。我相信唯一指定 ios::out 会有所不同的是您是否使用 fstream,它可以打开以进行读取或写入,或两者兼而有之。

于 2010-02-09T17:51:19.077 回答
2

在大多数情况下,我希望没有区别,尽管这似乎在技术上可能是特定于实现的。

在我的实现(gcc 3.4.3)中,ofstream 的 open 在 ofstream->open() 调用中使用 ios:::out 模式,无论通过构造函数指定什么,因此它完全是可选的。如果使用 fstream,则情况并非如此,需要明确指定。

于 2010-02-09T17:57:19.910 回答
2

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

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

我不知道为什么人们会发现fstream没有ios::inor的开头ios::out,但是我对标准的阅读表明它不应该起作用。我会对其他人对 27.8.1.3 的阅读感兴趣。

于 2010-02-09T18:17:38.837 回答
1

感谢所有回答我的人:我现在根据我得到的回答测试了几个代码并得出了这个摘要:

using ofstream: ios::out 是默认值,即使未指定任何内容,但如果您仅使用 ios::in 和 ofstream,则不会出现编译错误(除非您使用 read() 或 >> 或某些 ifstream 对象)但没有文件会被写。

using ifstream: ios::in 是默认值,即使没有指定任何内容,但如果您只使用 ios::out 和 ifstream,则不会出现编译错误(除非您使用 write() 或 << 或某些 ofstream 对象)但您可以t 从文件中读取任何信息。

使用 fstream: 没有默认值,你必须明确地确定你要做什么。否则,不会出现编译错误,但您不会简单地得到您想要的。

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

于 2010-02-09T18:36:32.810 回答