2012-12-19 53 views
0

對於格式化提前抱歉。無法弄明白......試圖讀取配置文件

我通過參數

我試圖從特定參數讀取值傳遞一個配置文件到程序

我有一個用下面的方法cofigReader類從給定的特定參數

我的問題一個配置文件返回一個字符串,

它永遠不會找到的參數。發現是0或-1 ....

string configReader::value(string config_file, string parameter) 
{ 
    string value; 
    char config_delimiter = '='; 
    size_t found; 
    file.open(config_file); 
    std::string line; 
    bool param_found = false; 
    while(param_found == false){ 
     while (!file.eof()) 
     {  
      getline(file,line); 
      logger.writetolog("INFO","Looking for " + parameter + 
         " on line "+ line); 
      found = line.find(parameter); 
      logger.writetolog("INFO",int(found)); 
      if(found!=string::npos){ 
       param_found = true; 
      } 
     } 
     param_found = true; 
    } 
    if (found!=string::npos) 
    { 
     size_t a = line.find(config_delimiter)+1; 
     logger.writetolog("INFO","Found" + parameter + 
        "splitting string at delimter" + config_delimiter + 
        " and return right side value");  
     value = line.substr(a); 
     return value; 
    } 
    else 
    { 
     return value; 
    } 
    file.close(); 
} 

更多信息。配置文件如下所示。這樣使用

//attempt to parse out the required parameters for the program 
string toemail = config.value(configFileArg,"toemail"); 

[email protected] 
outputdir=C:\tmp 

configReader類,它總是返回空

+1

如果'found'爲'0',那麼參數_was_在字符串的開頭找到。輸出是什麼樣的? – Chad

回答

3

while (!file.eof())循環繼續找到匹配後,過寫作,你以後檢查found值。

你可以通過改變你的循環,像

bool param_found = false; 
while (!param_found && !file.eof()) {  
    if (getline(file,line)) { 
     break; 
    } 
    logger.writetolog("INFO","Looking for " + parameter +" on line "+ line); 
    found = line.find(parameter); 
    logger.writetolog("INFO",int(found)); 
    if(found!=string::npos){ 
     param_found = true; 
     break; 
    } 
} 

,而不是解決這個問題。 (請注意,此代碼刪除您光顧(param_found ==假)環路sftrabbit指出,這個循環是不必要的。)

+1

此外,外'while'循環毫無意義。它只能循環一次。 –

+0

是的,謝謝+1。我注意到了,但是你只是用你的帖子來擊敗我:) – simonc

+1

如果'getline(file,line);'失敗了怎麼辦?循環應該寫成'while(getline(file,line))',你可以隨時分解它,設置任何你想要的變量。 – Nawaz

2

慣用的方式來寫循環是這樣的:

bool param_found = false; 

while (std::getline(file,line)) //<-- this is idiomatic loop! 
{        //successfully read OR exit from the loop 

    logger.writetolog("INFO","Looking for " + parameter +" on line "+ line); 
    found = line.find(parameter); 
    logger.writetolog("INFO",int(found)); 
    if(found!=string::npos){ 
     param_found = true; 
     break; 
    } 
} 

你不應該

:寫循環時使用

這兩個主題詳細討論了這一點。

+1

+1比我提議的 – simonc

+0

有趣的更好的解決方案。很有意思。那麼,沒有EOF needeD? – nkuebelbeck

+0

@nkuebelbeck:是的,'eof()'對於這樣的循環是無用的。 – Nawaz