以附加模式打开文件但截断文件

时间:2014-09-04 16:25:36

标签: c++ fstream flags

我想以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);

现在它正在工作,为什么?

2 个答案:

答案 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}}的文件。