我一直在用 ofstreams 写入文件时遇到奇怪的问题,现在有了
ofstream.fail()
在我的 ofstream.open() 调用之后立即返回 true。
是否有一些方法可以获得额外的信息,比如关于为什么设置失败状态的更多细节?
编辑,附加信息:is_open() 返回 false。
刚刚发现同样的情况,我解决了一个已经阅读的错字
if (!outfile.is_open());
{
}
没有注意到 if 语句后的分号...
确保它ofstream
没有与之关联的文件(已经用该流打开了一个文件)。根据http://www.cplusplus.com/reference/fstream/ofstream/open/:
如果对象已经有一个关联的文件(打开),则函数失败。失败时,设置失败位标志(可以使用成员失败检查),并且根据设置的值设置异常,可能会引发异常。
如果您打开了文件,请在打开之前将其关闭。
编辑:如上所示,您可以failbit flag
通过使用检查设置了哪个 'stream.rdstate()
引用这个
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;
}
io_state word=ofstream.rdstate();
if(word & ios::failbit){
cout<<"Failbit flag is set";
}
//etc