gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:31:47 34 4
gpt4 key购买 nike

我正在尝试打开一个输出文件,我确信它有一个唯一的名称,但它偶尔会失败。由于 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;
}

最佳答案

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

我假设您熟悉使用 exceptions method控制 iostream 失败是作为异常还是作为状态标志进行通信。

根据我的经验,当 I/O 操作失败时,iostream 类很少提供关于错误原因的详细信息。但是,由于它们通常是使用较低级别的标准 C 和操作系统 API 函数实现的,因此您通常可以在底层 C 或操作系统错误代码中获取更多详细信息。我很幸运地使用以下函数来执行此操作。

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;
}

关于c++ - 为什么 ofstream 无法在 C++ 中打开文件?原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1725714/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com