我正在尝试打开一个输出文件,我确信它有一个唯一的名称但它偶尔会失败。我找不到有关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;
}
答案 0 :(得分:10)
打开的文件句柄太多了?空间不足?拒绝访问?间歇性网络驱动问题?文件已存在?文件已锁定?没有更多细节,很难说。 编辑:根据您提供的额外详细信息,听起来您可能正在泄漏文件句柄(打开文件并且无法关闭它们,因此耗尽了每个进程的文件句柄限制)。
我假设您熟悉使用exceptions
method来控制是否将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;
}
答案 1 :(得分:2)
您可能空间不足,或者可能存在许可问题。操作系统也可能已锁定该文件。尝试使用不同的名称/路径进行踢球,看看它是否有效。
答案 2 :(得分:1)
一种可能性是您运行了同一程序的另一个实例。
另一个原因是,您可能会在彼此之后运行两个实例(用于调试目的?),并且操作系统尚未完成关闭文件并在下一个程序实例出现之前重置锁定并请求它。