我使用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
的构造函数之外的其他地方调用的吗?