我遇到过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
现在,我想问题是,有人可以帮我解决这个问题吗?为什么最后一个解决方案有效,但中间解决方案没有。
编辑:更正了主要功能。你每天都学到一些东西。
答案 0 :(得分:7)
ofstream
默认为std::ios::trunc
- 截断现有内容的标志。传递std::ios::in
会禁用截断(除非还指定了trunc
标志)。
实际上,规则是fstream
如果使用trunc
标志,或者out
标志被使用且in
也不app
,则会执行截断(注意app
与ate
不同,app
重新定位每次写入,而ate
仅影响初始指针)。 ofstream
会自动设置out
。如果没有trunc
,则无法使用out
。