2014-07-25 110 views
0

(對不起,如果我的保證金充滿mystakes,我會盡我所能寫一些可讀的)嗨,我正在研究一個函數讀取文件和存儲每一行​​的第一行char是「:」並刪除字符串中包含的每個短劃線。每次找到這種類型的行時,push_back()都被用來將這一行存儲在向量中。問題是,每次使用push_back()時,向量中的所有元素都取最後一個元素的值。我不明白爲什麼會發生。下面的代碼:std :: vector做奇怪的事情

string listContent; 
size_t dashPos; 
vector<char*>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     char* c_listContent = (char*)listContent.c_str(); 
     cTagsList.push_back(c_listContent); 
    } 
} 

我開始還以爲是與該文件的末尾,但中止搜索過程之前達到這一點給出了相同的結果有問題。

+2

首先,['而(!EOF())'是錯誤的。(http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)第二,將'c_str'的​​結果轉換爲'char *'非常糟糕。第三,只要修改字符串,該指針就無效,該字符串恰好在後面發生。使用'std :: string'的向量。無論如何,你並沒有消除每一次衝刺,你會在第一次衝刺之後消除所有事情。使用'std :: remove'並將其與'erase'配對。 – chris

+3

請不要*存儲'c_str'的​​結果!相反,只需要使用char *只有在處理純c的時候,你在C++ – crashmstr

+0

char *,使用std :: string,你不必考慮太多 – blade

回答

2

的c_str() - 的std::string狀態方法:

返回可以通過進一步的呼叫到該修改的對象的其他成員函數被無效的指針。

如果你允許使用一個std ::矢量<的std :: string>代替字符*的載體,你是罰款,因爲會有永遠的std :: string的一個副本的listContent推入矢量,即。

std::string listContent; 
size_t dashPos; 
std::vector<std::string>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     cTagsList.push_back(listContent); 
    } 
} 

(我沒有測試過)

+0

正如我回復了第一篇文章,我需要一個字符,但我會嘗試通過將std :: vector 轉換爲char來獲得它,謝謝你的幫助 – Faeralis

+0

@ Faeralis刀片已經指出了std :: string的[]運算符,它提供了對字符串中每個字符的隨機訪問,你可以做的另一種選擇是像以前一樣使用.c_str(),但是已經存儲在字符串中的字符串矢量 –

+0

這就是我試過的,我工作。 – Faeralis