C++ 覆盖已经打开的文件

标签 c++ io

我正在使用 ifstream 打开一个文件来检查它是否存在。然后我关闭它并使用 ofstream 打开它来写入它,我认为设置 ios::trunc 标志允许我覆盖它。

但是,如果文件存在,我希望能够保持文件打开状态,但我使用了 ifstream 来打开它,这是否意味着我无法写入该文件,直到我关闭并使用 fstreamofstream 重新打开?我一开始就没有使用 fstream,因为它无法告诉我该文件是否已经存在。

最佳答案

只需在文件上打开一个读写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)

关于C++ 覆盖已经打开的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7436582/

相关文章:

C++:两个独立的函数在嵌套时返回不同的结果?

c++ - 查找字符串中存在的不同字符

c++ - 如何设置一个 std::vector 与另一个,其中两个是不同类的 vector ?

c++ - 带有显式右值转换运算符的 static_cast

c++ - 使用四元数进行OpenGL旋转

java - 为什么我用java向文件写入数据这么慢

java - Java 中通过标准输入/输出进行通信

python - 如何在 Haskell 中表达这个 Python for 循环?

haskell - 在这个例子中,我可以确定 IO 操作的顺序吗?

java - 即使文件夹存在, file.listFiles() 返回 null