为什么使用标志 ios::ate 和 ios::out 打开 fstream 时会被截断?

Why is an fstream truncated when it is opened with the flags ios::ate and ios::out?

我用 ios::ate 和 ios::out 标志打开了我的 fstream,我注意到文件被截断了。如果我也设置了一个标志ios::in,就不会出现这个问题。然后输出和输入位置就可以了。但我的问题是,如果未设置 ios::in 标志,如果文件被默认截断,ios::ate 标志的意义是什么?

尽管标准中有暗示,ios::ate 实际上与是否发生截断没有任何关系。

在内部,fstream 对象有一个缓冲区(一个 filebuf 对象)。写入时是否将缓冲区的内容追加到文件中,完全取决于 ios::in 和 ios::out 的组合 - 您需要同时追加。 (或ios::app)

ios::ate 不会附加缓冲区 - 它可以帮助您计算文件大小和文件内的相对位置。不同的东西。

查看此 以了解各种模式的讨论 - 您会注意到 ios::ate 对模式没有影响,并且您需要 in|out(或应用程序)才能获得 +。