我想以append
模式打开文件,但是,如果该文件已存在,则覆盖其内容。
我尝试过这样的事情,但这不会奏效(我不会对|和&运营商有太多经验,你可以注意到):
//does nothing
_fs.open(_path, std::ios_base::out | std::ios_base::app | std::ios_base::trunc);
然后我决定以out
模式打开文件,然后在append
模式下再次打开之前将其关闭,但当然这似乎是一种糟糕的编程方式:
if(fexists(_path.c_str())){//Checks if the file exists
_fs.open(_path, std::ios::out);//Overrides the contents
_fs.close();
}
_fs.open(_path, std::ios_base::out | std::ios_base::app);
然后直觉地我写了这样的东西:
_fs.open(_path, std::ios_base::out | std::ios_base::app & std::ios_base::out | std::ios_base::trunc);
现在它正在工作,为什么?
答案 0 :(得分:2)
这是因为
std::ios_base::out | std::ios_base::app & std::ios_base::out | std::ios_base::trunc
==
std::ios_base::out | (std::ios_base::app & std::ios_base::out) | std::ios_base::trunc
==
std::ios_base::out | 0 | std::ios_base::trunc
==
std::ios_base::out | std::ios_base::trunc
实际上你想要的是:打开文件进行写入,如果存在则截断它。
(当然std::ios_base::trunc
是多余的,如0x499602d2所述 - 您只能指定std::ios_base::out
)
答案 1 :(得分:1)
我想以追加模式打开文件,但是,如果该文件已存在,则覆盖其内容。
这与简单地清空文件一样,无论它是否存在。当std::ofstream()
不存在时,std::ios_base::app
会创建一个新的空文件,如果存在,则默认情况下会删除其内容,除非您使用std::ios_base::out
。
所以听起来你只想打开只有{{1}}的文件。