为什么ofstream无法在C++中打开文件?原因是什么?

Ram*_*ngh 2 c++

我正在尝试打开一个输出文件,我确信它有一个唯一的名称,但它偶尔会失败.我找不到任何有关ofstream构造函数失败的原因的信息.

编辑: 它在某个时间点开始失败,之后它一直失败,直到我停止运行程序写入此文件.

编辑: 偶尔= 22-24小时

代码片段(我不这样会有所帮助,但仍然有人要求它)

ofstream theFile( sLocalFile.c_str(), ios::binary | ios::out );
if ( theFile.fail() ) 
{
    std::string sErr = " failed to open ";
    sErr += sLocalFile;
    log_message( sErr );
    return FILE_OPEN_FAILED;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ley 10

打开的文件句柄太多了?空间不足?拒绝访问?间歇性网络驱动问题?文件已存在?文件已锁定?没有更多细节,很难说. 编辑:根据您提供的额外详细信息,听起来您可能正在泄漏文件句柄(打开文件并且无法关闭它们,因此耗尽了每个进程的文件句柄限制).

我假设您熟悉使用该exceptions方法来控制是将iostream故障作为异常还是作为状态标志进行通信.

根据我的经验,这些iostream类在I/O操作期间失败时提供了很少的细节.但是,因为它们通常使用较低级别的标准C和OS API函数实现,所以通常可以获取底层的C或OS错误代码以获取更多详细信息.我很幸运使用以下功能来做到这一点.

std::string DescribeIosFailure(const std::ios& stream)
{
  std::string result;

  if (stream.eof()) {
    result = "Unexpected end of file.";
  }

#ifdef WIN32
  // GetLastError() gives more details than errno.
  else if (GetLastError() != 0) {
    result = FormatSystemMessage(GetLastError());
  }
#endif

  else if (errno) {
#if defined(__unix__)
    // We use strerror_r because it's threadsafe.
    // GNU's strerror_r returns a string and may ignore buffer completely.
    char buffer[255];
    result = std::string(strerror_r(errno, buffer, sizeof(buffer)));
#else
    result = std::string(strerror(errno));
#endif
  }

  else {
    result = "Unknown file error.";
  }

  boost::trim_right(result);  // from Boost String Algorithms library
  return result;
}
Run Code Online (Sandbox Code Playgroud)