【问题标题】:fstream::close() doesn't close filefstream::close() 不关闭文件
【发布时间】:2011-12-28 06:50:24
【问题描述】:

我有一个程序读取一组文件,关闭它们,然后尝试删除它们。

有时(不总是,但经常)删除失败并出现“共享冲突”错误。

使用 sysinternals 进程监视器我看到在这些情况下关闭操作没有反映在进程监视器中。

似乎有时会无缘无故地跳过关闭系统调用,并且没有任何异常。

这发生在使用 Visual Studio 2010 的 Windows 7 64 位机器上。

代码示例;

void readFile(string file)
{
  ifstream stream(file);
  string line;
  while(getline(stream, line))
  {
    cout << line << endl:
  }
  stream.close(); // this is redundant
}

//调用代码:

readFile(file);
if(remove(file.c_str()) != 0)
{
  cout << "file deletion failed" << endl;
}

【问题讨论】:

  • 重现问题的最小测试用例会很好。
  • 相关代码非常分散,所以复制所有相关代码是有问题的。此外,相同的代码在其他应用程序中也没有任何问题。
  • 如果代码是分散的,那么请尝试创建一个最小的代码示例来重现问题,当您这样做时,问题很可能会暴露给您。没有代码,答案将仅仅是猜测和没有别的。
  • 您是否使用 pointer 进行流式传输?或者,也许,您正在使用指向具有 fstream 的类的指针?
  • 如果代码过于分散而无法复制,则可能是过于分散而无法修复。控制它,简化它,或者学会忍受崩溃。

标签: c++ visual-studio-2010 iostream


【解决方案1】:

首先,您的代码缺少;。将此cout &lt;&lt; line &lt;&lt; endl: 更改为此cout &lt;&lt; line &lt;&lt; endl;

这是一个类似的问题:Any reason why an std::ofstream object won't close properly?

【讨论】:

    【解决方案2】:

    如果您使用 CreateProcess 和 bInheritHandles=true 创建中间进程,则可能会发生这种情况。新进程将继承文件句柄,并且文件不会被您的主进程关闭,因为仍有一个未完成的句柄。这可以解释为什么您在进程监视器中看不到关闭操作,一旦所有句柄都被释放,操作系统将关闭文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2018-02-23
      • 2021-05-08
      • 1970-01-01
      • 2019-03-07
      相关资源
      最近更新 更多