2015-05-19 164 views
-4

在這段代碼中,在while循環的每次迭代中,從文件中讀取一行。該生產線是一樣的東西:這段C++代碼有什麼問題?

13,4636137,29464742,29464746,995560164

在大膽指定的每個號碼,該號碼在一個std一個關鍵的存在::地圖在檢查for循環。如果密鑰存在,則該值將附加到該字符串。然後將字符串寫入文件。

如果其中一個鍵不存在於映射中,那麼對於該行,什麼都不應寫入該文件。 (bool is_points_in_range)

但實際上,在最後一點(for循環之外)不在鍵列表中的情況下,程序邏輯運行良好。

爲什麼布爾運算符在for循環中沒有變化?

vector<string> res; 
ifstream infile; 
map<string, string> m; 
while(infile.getline(buffer, LINE_BUFFER_LEN)) 
{ 
    line=string(buffer); 
    res = SplitBySep(line, ","); 
    bool is_points_in_range=true; 
    string geo_file_line; 
    for (int i=2;i<res.size()-1;i++){ 
     if (m.find(res[i]) == m.end()) { 
      is_points_in_range=false; 
      break; 
     } else { 
      geo_file_line= geo_file_line.append(m[res[i]]).append("^"); 
     } 
    } 
    if (m.find(res[res.size()-1]) == m.end()) { 
     is_points_in_range=false;  
    } else { 
     geo_file_line= geo_file_line.append(m[res[res.size()-1]]).append("\n"); 
    } 
    if (is_points_in_range){ 
     fprintf(fp_geo, "%s",geo_file_line.c_str()); 
    } 
} 
+2

您是否嘗試過調試該程序?什麼是「res」?你正在從infile中讀取,但是在你的代碼中沒有任何地方處理'buffer'或'line',所以你如何期待它的工作? – Excelcius

+0

我編輯了代碼,我從文件中讀取,然後用一個我知道很好的函數標記它。 – user2949310

+0

順便說一句,它很難讀取你的代碼 – Quest

回答

1

res.size()-1極其危險res.size()是一個無符號類型,並且在res.size()爲0時將其從中減去1,由於環繞將給你一個非常大的無符號整數。

因此,當res未填充時,您的程序基本上未定義。

我很驚訝你的編譯器沒有警告你。你有警告關掉嗎?

+0

我編輯了代碼。請再看一遍。編譯時沒有警告,我也沒有關閉警告。 – user2949310

+0

你還有'res [res.size() - 1]'。 – Bathsheba

0

它看起來像 m.find(res[i]) == m.end() 永遠不會是真的。 你確定這張桌子是完整的嗎? res[i]

+0

是的。我編輯了代碼,請再看一遍。 – user2949310

0

最好問一下,爲什麼這條件聲明不起作用? 我們知道,獲得一個關鍵在一個std ::地圖存在,我們可以使用:

if (m.find("f") == m.end()) { 
    // not found 
} else { 
    // found 
} 

this question表示。

map<string, string> m; 

這種說法不能很好地工作。我沒有任何29464742鍵(我確定),但是當我搜索這個鍵時,else部分被執行。另外當我使用m.count('29464742')時,返回1。 我不知道爲什麼?

我糾正我的代碼以這個條件語句:

if (m["f"] == "") { 
    // not found 
} else { 
    // found 
} 

這對我的作品和我的問題就解決了。

+0

老實說,我認爲你不知道你的代碼中發生了什麼。在執行條件之前,你應該學習如何調試和查看地圖的內容(「我確定」聽起來不像是我的好證明)。你只是用另一個SO問題的任意條件代替它,這個問題永遠是真的。如果這是你總是可以完全擺脫'if'語句之後的情況。 – Excelcius