2015-11-05 41 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的構造函數?