我正在尝试打开一个输出文件,我确信它有一个唯一的名称,但它偶尔会失败.我找不到任何有关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)