【发布时间】:2010-02-09 17:41:10
【问题描述】:
如果我打开了类似的文件:
ofstream file("file.dat",ios::binary);
或
ofstream file("file.dat",ios::binary | ios::out);
我可以用后一种形式打开的文件做什么,而我不能用前一种形式做,反之亦然
谢谢
【问题讨论】:
如果我打开了类似的文件:
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),并将它们映射到 C fopen() 参数。根据标准,如果打开的文件没有指定修饰符,则打开失败。
在 27.8.1.9 中,我们发现 ofstream 的工作方式类似,但自动指定了 ios::out。因此,原始问题的答案是两者的工作方式完全相同。
我不知道为什么人们会发现以fstream 开头而没有ios::in 或ios::out,但我对标准的阅读表明它不应该工作。我会对其他人对 27.8.1.3 的阅读感兴趣。
【讨论】:
感谢所有回答我的人: 我现在根据我得到的回答测试了几个代码并得出了这个摘要:
使用 ofstream: ios::out 是默认值,即使未指定任何内容,但如果您仅将 ios::in 与 ofstream 一起使用,则不会出现编译错误(除非您使用 read() 或 >> 或某些 ifstream 对象)但不会写入文件。
使用 ifstream: ios::in 是默认值,即使未指定任何内容,但如果您仅使用 ios::out 和 ifstream,则不会出现编译错误(除非您使用 write() 或
使用 fstream: 没有默认值,您必须明确确定要做什么。否则,没有编译错误,但你没有得到你想要的。
至于原始问题,两者的工作原理完全相同!
【讨论】: