流奇怪的行为

时间:2012-06-04 00:34:13

标签: c++ file-io iostream

我遇到过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;
}

这会产生正确的输出。

  

something1something2

现在,如果我用以下代码替换第9行,

file.open("file.txt", std::ios::ate);

我得到了这个输出。

  

something2

但如果我再次替换第9行,这次使用此代码,

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

我得到了这个输出。

  

something1something2

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

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

1 个答案:

答案 0 :(得分:7)

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

实际上,规则是fstream如果使用trunc标志,或者out标志被使用且in也不app,则会执行截断(注意appate不同,app重新定位每次写入,而ate仅影响初始指针)。 ofstream会自动设置out。如果没有trunc,则无法使用out