根据这个 C++ 参考文献:http://www.cplusplus.com/reference/fstream/ofstream/ofstream/,
另一方面,Apache C++ 标准库用户指南 (http://stdcxx.apache.org/doc/stdlibug/30-3.html) 在第 30.3.1.2 段的注释中指出:“对于输出文件流,out 打开模式等同于 out|trunc,也就是说,你可以省略 trunc 标志。然而,对于双向文件流,必须显式地指定 trunc。”
我已经尝试了这段代码:
std::ofstream
的默认打开模式是 ios_base::out
,并且没有其他隐式模式。因此,如果我用一个小文件覆盖一个大文件,大文件的“超出”部分应该保持不变,只有文件的前面部分被新的、较短的数据所替换。另一方面,Apache C++ 标准库用户指南 (http://stdcxx.apache.org/doc/stdlibug/30-3.html) 在第 30.3.1.2 段的注释中指出:“对于输出文件流,out 打开模式等同于 out|trunc,也就是说,你可以省略 trunc 标志。然而,对于双向文件流,必须显式地指定 trunc。”
我已经尝试了这段代码:
#include <fstream>
int main()
{
std::ofstream aFileStream("a.out", std::ios_base::out);
aFileStream << "Hello world!";
aFileStream.close();
std::ofstream aFileStream2("a.out", std::ios::out);
aFileStream2 << "Bye!";
aFileStream2.close();
}
使用Windows的g++ 8.1和Linux的g++ 6.3,Apache文档似乎是正确的。大文件被截断,在第二个文件流写入较短字符串后没有剩余。
为什么会这样呢?cplusplus.com是错误的吗?还是行为取决于什么?