为什么当一个流被打开时,它被截断了 ios::ate 和 ios::out 标志

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

本文关键字:ios out ate 标志 一个 为什么      更新时间:2023-10-16

我用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(或app)才能获得+。