【问题标题】:What happens if i open a file that is already open in C++如果我打开一个已经在 C++ 中打开的文件会发生什么
【发布时间】:2021-09-25 18:39:40
【问题描述】:

假设我声明了一个输出文件。

如果我用这段代码打开它两次会发生什么?还能用吗?

ofstream outfile;
outfile.open("record.txt", std::ofstream::app);
outfile.open("record.txt", std::ofstream::app);

【问题讨论】:

  • 试了会怎样,还能用吗?
  • 我正在调试其他错误,目前正在编写一个大程序。
  • @muhammadmuzaib:您的IDE 不允许您在硬盘上存储多个项目吗?不能写个小测试程序吗?
  • 我编译了程序,它运行没有错误。对于我的项目,我找到了一种不必打开文件两次的方法。

标签: c++ file fstream


【解决方案1】:

根据documentation on std::ofstream::open,它的行为方式与std::basic_filebuf::open 相同。根据the documentation on that function,如果文件已经打开,操作会失败。

这意味着对std::ofstream::open 的第二次调用将使流处于设置failbit 的状态。因此,流上的大多数后续操作都会失败,直到该位被清除。为了清除该位,您必须调用std::ofstream::clear。之后,流将再次正常运行。

上面的答案适用于尝试使用相同的std::ofstream 对象打开两个文件,无论它是否是同一个文件。

尝试使用两个不同的 std::ofstream 对象(您在问题中没有这样做)打开同一个文件是一个完全不同的问题。不建议这样做,因为即使操作系统允许多次打开一个文件,这也可能会为每个流对象提供自己的缓冲区,该缓冲区与其他流的缓冲区不同步。这可能会导致文件损坏。但是,如果两个流都访问文件中相距很远的完全不同部分,它可能会起作用(但我仍然不建议冒险)。

【讨论】:

  • 所以如果操作失败,我们仍然可以写入文件,对吗?还是程序无法编译?
  • @muhammadmuzaib "程序不会编译吗?" -- 运行时操作永远不会导致编译失败。
  • @RemyLebeau:啊,是的,你是对的。我已删除我的错误评论并将该信息添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多