我在使用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);
一切正常。
我不知道为什么我会失败,你能帮助我吗?
答案 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
的构造函数中调用了其他地方?