【发布时间】:2019-07-17 06:41:50
【问题描述】:
根据这个 C++ 参考:http://www.cplusplus.com/reference/fstream/ofstream/ofstream/,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 错了吗?或者行为取决于什么?
【问题讨论】:
-
根据cppreference,out 将删除现有文件中的内容(因此覆盖所有内容)