2015-11-05 42 views
0


我在使用fstream访问文件时遇到问题。 下面是代码
fstream.open()set failbit

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 /节目传播/ BorneApp/
当我改变这个

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

这样:

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

,一切工作正常。

我不uderstan为什么我有那个失败位,你能帮我吗?

+0

如果从命令行使用'cat/home/borne/BorneApp/borne.conf'打印文件,会发生什么? – pcarter

+0

我已经打印了文件内容(它存在,这是一条好路径) –

+0

我担心这个问题出现在你隐藏的代码中。你能否给我们一个最小但完整的例子来重现这个问题? – AProgrammer

回答

0

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

我的猜测是fstream已经与一个文件相关联(也就是说由于某种原因您已经在其上调用了open)。

如果该流已经与一个文件关联,则调用open就会失败。

下面是一个简单的例子:

运行它打印[2] Failed,这相当于你的描述。如果文件无法打开,_file.is_open()将回复false,如本示例所示,test.txt被取消或读取权限已从中删除。

所以你的代码中的东西可能会让open被调用两次。它是否在你的代码中的其他地方被称为Conf的构造函数?