如果我打开一个像这样的文件:
ofstream file("file.dat",ios::binary);
或者
ofstream file("file.dat",ios::binary | ios::out);
我可以用后一种形式打开的文件做什么,而我不能用前一种形式做,反之亦然
谢谢你
对于一个ofstream,ios::out
是默认的,所以没有区别。我相信唯一指定 ios::out 会有所不同的是您是否使用 fstream,它可以打开以进行读取或写入,或两者兼而有之。
在大多数情况下,我希望没有区别,尽管这似乎在技术上可能是特定于实现的。
在我的实现(gcc 3.4.3)中,ofstream 的 open 在 ofstream->open() 调用中使用 ios:::out 模式,无论通过构造函数指定什么,因此它完全是可选的。如果使用 fstream,则情况并非如此,需要明确指定。
查看标准,第 27.8.1.3 节讨论了各种ios
修饰符(如ios::in
和ios::out
),并将它们映射到 Cfopen()
参数。根据标准,如果打开的文件没有指定修饰符,则打开失败。
在 27.8.1.9 中,我们发现它ofstream
是这样工作的,但会ios::out
自动指定。因此,原始问题的答案是两者的工作方式完全相同。
我不知道为什么人们会发现fstream
没有ios::in
or的开头ios::out
,但是我对标准的阅读表明它不应该起作用。我会对其他人对 27.8.1.3 的阅读感兴趣。
感谢所有回答我的人:我现在根据我得到的回答测试了几个代码并得出了这个摘要:
using ofstream: ios::out 是默认值,即使未指定任何内容,但如果您仅使用 ios::in 和 ofstream,则不会出现编译错误(除非您使用 read() 或 >> 或某些 ifstream 对象)但没有文件会被写。
using ifstream: ios::in 是默认值,即使没有指定任何内容,但如果您只使用 ios::out 和 ifstream,则不会出现编译错误(除非您使用 write() 或 << 或某些 ofstream 对象)但您可以t 从文件中读取任何信息。
使用 fstream: 没有默认值,你必须明确地确定你要做什么。否则,不会出现编译错误,但您不会简单地得到您想要的。
至于原始问题,两者的工作原理完全相同!