c++调试stream fail()状态

c++ debugging ofstream fail() states?

本文关键字:状态 fail 调试 stream c++      更新时间:2023-10-16

我一直有奇怪的问题写文件与流,现在有

ofstream.fail()

在调用ofstream.open()之后返回true。

是否有一些方法可以获得额外的信息,比如关于为什么设置失败状态的更多细节?

编辑,附加信息:is_open()返回false

确保ofstream没有与它相关联的文件(已经用该流打开了一个文件)。根据http://www.cplusplus.com/reference/fstream/ofstream/open/:

如果对象已经关联了一个文件(打开),则函数失败。失败时,设置failbit标志(可通过成员fail检查),根据异常设置的值,可能会抛出异常。

如果你打开了一个文件,在打开之前关闭它。

编辑:如上所示,您可以使用stream.rdstate()

检查设置了哪个' failbit flag '

刚刚发现了同样的情况,我解决了一个打印错误,上面写着

如果(

! outfile.is_open ());

{

}

不注意if语句后面的分号…

io_state word=ofstream.rdstate();
if(word & ios::failbit){
    cout<<"Failbit flag is set";
}
//etc

引用

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