fstream.open()设置failbit

时间:2015-11-05 14:48:36

标签: c++ unix std


我在使用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);

一切正常。

我不知道为什么我会失败,你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果我理解,_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,这与您描述的内容相对应。如果无法打开该文件,_file.is_open()将回复false,因为此示例显示何时抑制test.txt或从中删除读取权限。

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