我正在打开一个ifstream
的文件来检查它是否存在。然后我关闭它并用ofstream
打开它来写入它,我认为设置ios::trunc
标志允许我覆盖它。
但是我想保持文件打开的能力,如果它存在,但是我使用ifstream
打开它,这意味着我不能写入文件,直到我关闭并重新打开使用fstream
或ofstream
?我没有使用fstream
开头,因为这不会告诉我文件是否已经存在。
答案 0 :(得分:2)
只需在文件上打开读写fstream
即可。您可以通过搜索到最后并查看您是否处于非零偏移来测试以前存在的文件(并且是非空的)。如果是这样,文件存在,你可以用它做任何事情。如果不是,则该文件不存在或为空。假设您不需要区分这两种情况,则可以继续进行,就好像它不存在一样。
例如:
// Error checking omitted for expository purposes
std::fstream f("file.txt", std::ios::in | std::ios::out);
f.seekg(0, std::ios::end)
bool didFileExist = (f.tellg() > 0);
f.seekg(0, std::ios::beg);
// Now use the file in read-write mode. If didFileExist is true, then the
// file previously existed (and has not yet been modified)
答案 1 :(得分:1)
设置ios::trunc
将删除文件的先前内容
尝试打开没有此设置的文件;只有'写'设置。
答案 2 :(得分:0)
这是非常严重的问题 - 竞争条件 - 如果有人在关闭和重新开放之间设法对此文件做些什么呢?不幸的是,iostream没有提供解决该问题的任何方法 - 您可以使用cstdio FILE。如果你想在存在时转换文件,或者如果不使用fopen(名称,“w”)则创建新文件。如果你想转换文件,如果它存在或失败,那么似乎标准库没有提供任何东西,你应该去其他库或平台特定的函数,如windows.h中的OpenFile