我遇到了一种奇怪的 ofstream 行为,“对我来说最不奇怪。这是我的程序,我使用的是 Visual Studio 2010 Express Edition。

int main () {

    std::ofstream file("file.txt");
    file << "something1";
    file.close();

    file.open("file.txt", std::ios::ate | std::ios::in );
    file << "something2";
    file.close();

    return 0;
}

这会产生正确的输出。



现在,如果我用以下代码替换第 9 行,
file.open("file.txt", std::ios::ate);

我得到这个输出。



但是如果我再次替换第 9 行,这次是用这个代码,
file.open("file.txt", std::ios::ate | std::ios::in );

我得到这个输出。



现在,我想问题是,有人可以帮我弄清楚这件事吗?为什么最后一个解决方案有效,但中间的解决方案无效。

编辑: 更正了主要功能。你每天都会学到一些东西。

最佳答案

ofstream 默认为 std::ios::trunc —— 截断现有内容的标志。传递 std::ios::in 会禁用截断(除非还指定了 trunc 标志)。

实际上,规则是如果使用 fstream 标志,或者如果使用 trunc 标志并且 outin 都没有(注意 appapp 不同,ate 每次写入都会重新定位,而 app 只影响初始指针),则规则是 ate 执行截断。 ofstream 自动设置 outtrunc 不能在没有 out 的情况下使用。

关于c++ - 异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10875134/

10-11 23:01