fstream.open()设置故障位




我使用fstream访问文件时遇到问题。这是代码

 Conf::Conf()
{
  log = Log::Instance();
  _db_user = "";
  _db_password = "";
  _db_tableName = "";
  _treat["db:user"] = &Conf::set_db_user;
  _treat["db:adress"] = &Conf::set_db_adress;
  _treat["db:password"] = &Conf::set_db_password;
  _treat["db:tableName"] = &Conf::set_db_tableName;
  _treat["broadcast:adress"] = &Conf::set_broadcast_adress;
  _file.open("/home/borne/BorneApp/borne.conf", std::fstream::in);
  if (!_file.is_open())
    log->logThis("Error while opening borne.conf", "[INIT]", Log::ERROR);
}

void Conf::extract()
{
  std::string tmp = "";
  while (std::getline(_file, tmp))
  {
   if (_treat.find(tmp.substr(0, tmp.find("="))) != _treat.end())
    callMember(this, _treat[tmp.substr(0, tmp.find("="))])(tmp);
   else
     log->logThis("Parse Error in your configuration file", "[CONF]", Log::WARNING);
   }
}

getline不给我任何

所以我要检查一下我是否有错误。。。_file.fail()设置为TRUE

事实:文件已正确打开
我从/home/borne/BorneApp/
启动程序当我更改这个时

_file.open("/home/borne/BorneApp/borne.conf", std::fstream::in);

到此:

_file.open("./borne.conf", std::fstream::in);

一切都很好。

我不明白为什么我会有那个失败的地方,你能帮我吗?

如果我理解得很好,_file.is_open()_file.fail()都返回true

我的猜测是fstream已经与一个文件相关联(即,由于某种原因,您已经对其调用了open)。

如果流已经与文件关联,则对其调用open失败。

这里有一个简单的例子:

#include <fstream>
#include <iostream>
int main(int argc, char **argv)
{
  std::fstream fs;
  fs.open("test.txt", std::fstream::in);
  if(!fs.is_open())
    std::cout << "Not opened" << std::endl;
  if(fs.fail())
    std::cout << "Failed" << std::endl;
  fs.open("test2.txt", std::fstream::in);
  if(!fs.is_open())
    std::cout << "[2] Not opened" << std::endl;
  if(fs.fail())
    std::cout << "[2] Failed" << std::endl;
  return 0;
}

运行它会打印[2] Failed,这与您所描述的内容相对应。如果文件无法打开,当test.txt被抑制或读取权限被删除时,_file.is_open()会回复false,如本例所示

因此,代码中的某些内容可能会使open被调用两次。它是在代码中Conf的构造函数之外的其他地方调用的吗?

最新更新