【问题标题】:Suspend program till ofstream::flush() is finished暂停程序直到 ofstream::flush() 完成
【发布时间】:2014-03-11 02:04:56
【问题描述】:

我在写入后刷新ofstream,需要更新到实际文件并启动一个外部程序来打开它,我需要保持ofstream打开而不关闭它。我做到了:

ofstream f("..", std::ofstream::out | std::ofstream::app | std::ofstream::trunc);
f << data << std::endl;
f.flush();

但是当外部程序执行时该文件甚至不存在。同样的问题here。如何阻止程序直到文件实际存在于文件系统中?

【问题讨论】:

  • 也许这会有所帮助:cplusplus.com/forum/general/7343
  • 也许问题出在其他地方?我认为文件应该存在并且可以读取,即使它们还没有写入磁盘并且使用 f.flush() 就足够了。
  • 关闭和睡眠是否有效?

标签: c++ ofstream


【解决方案1】:

如果那是您的代码,那么“..”在 ofstream f() 的声明中不是有效的文件名。没有创建文件是正常的。刷新应该足以满足文件使用。 Append 和 Truncate 一起没有太大意义。 也许您的文件无法访问(共享独占)但仍被创建。

【讨论】:

    【解决方案2】:

    从您的应用程序的角度来看,一旦您打开文件进行写入,该文件就应该存在。通过执行以下步骤来验证这一点:

    1.) 打开与std::ifstream 相同的文件。调用应该成功。 (除非在极少数情况下,您的 std::ofstream 在文件上创建强制锁定。)

    2.) 将 std::ofstream 更改为 std::fstream。尝试从f.flush() 之后的文件中读取。您应该能够检索data 的值。如果没有,那么您可能在应用程序的某个地方弄乱了内存。

    3.) 确保系统上没有其他进程正在访问同一文件,例如一出现就删除它。

    注意:操作系统或文件系统驱动程序需要一些时间才能真正使任何文件更改对其他进程可用。当存储速度较慢或系统负载较高时,此延迟可能会特别长。您无法控制此延迟。在这种情况下,您应该研究进程间同步。

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多