2011-03-22 26 views
0

我有一個循環,執行以下操作:我不明白爲什麼地圖事業分割故障

short fooID; 
char line[256] 
map<short,foo> foos; 
set<short> barIDs; 
while (fgets(line,256,file) != NULL){ 
    string line_copy = line; 
    /*use token to split the line into several parameters which does not effect foo * bar*/ 
    string token = strtok(line,","); 
    token = strtok(NULL,","); 
    token = strtok(NULL,","); 
    token = strtok(NULL,","); 
    token = strtok(NULL,","); 
    barID = short(atoi(token)); 
    foo * bar; 
    bar = new foo; 
    if(barIDs.find(barID) == barIDs.end()){ 
    barIDs.insert(barID); 
    bar->setID(barID); 
    this->foos[barID] = bar; 
    } 
} 

當我運行這段代碼,我得到一個分段錯誤時,所有的酒吧都從文件加載。 barID範圍是1-1192。

有什麼想法?

感謝

上面的代碼只是我的實際代碼

+0

展'線'的聲明。 – 2011-03-22 09:35:57

+0

你顯示的代碼部分似乎是無辜的(模緩衝區溢出)。請顯示更多代碼。 – Vlad 2011-03-22 09:39:28

+0

你能夠運行這個代碼!?你遺漏了一個分號,你的fgets()是錯誤的,你沒有* /來關閉註釋。 – quasiverse 2011-03-22 09:39:41

回答

2
foo * bar; 

這將創建一個變量bar指向內存中的隨機位置鍵入的夏日。你需要使它指向一個有效的對象:bar = new foo; - 記住當你完成後刪除它,迭代你的地圖並刪除你添加的所有foo

+0

感謝您的重播。所有的聲明都是合法的(我會更新我的代碼段)。我懷疑C++試圖在末尾添加一個空行或者向我們顯示真實的代碼 – Yotam 2011-03-22 09:52:12

+1

。您的代碼段將無法編譯 - 除非我們*看到*您的代碼,否則我們無法發現代碼中的問題。 – Erik 2011-03-22 09:54:24

+0

我不需要刪除它們,因爲我想在整個運行過程中保留它們。無論如何,它不是我的錯誤的來源(因爲bar是在循環內聲明的,這意味着我正在爲每一步分配新的內存)。 – Yotam 2011-03-22 10:35:18

0

請注意,char * strtok (char * str, const char * delimiters)更改str參數的內容(請參閱C++ Reference on strtok)。也許你應該將line替換爲line_copy,因爲你聲明它爲string line_copy = line;

+0

line_copy是一個字符串 - 不是字符[] – Erik 2011-03-22 10:14:10

+0

我知道,但我不確定如果'行'在'strtok'過程中變爲'null'然後'fgets'讀取某事......而且,我正在考慮'string :: c_str'的方向。 – 2011-03-22 10:18:30

0

OK,我的猜測是,你崩潰的位置:

barID = short(atoi(token)); 

如果您的數據文件的最後一行有一個換行符,那麼最後fgets讀(返回的EOF NULL之前)將返回一個空白行。你沒有檢查這種情況。同樣,在將它傳遞給atoi之前,您不檢查strtok的結果。在空行上,結果將是NULL。所以atoi會崩潰。

這就是說,你在不斷地改變細節,所以我無法知道所描述的事件序列是否與你的實際代碼有關。這不是獲得幫助的好方法。我建議你將來會提供一個準確的代碼片段(compilable是最好的)和關於崩潰的一些細節(通常至少要確定崩潰的位置並不困難)。

+0

對於細節的事情我很抱歉。我試圖把所有的,只有相關的數據放入我的問題。我認爲這可能是一個空行問題,但在文件末尾沒有空白行。我會嘗試通過一個載體>並檢查它。 – Yotam 2011-03-22 11:57:55

+0

@ user596691 - 不管空行如何,爲什麼不添加'strtok'結果的檢查?假設一個函數總是會成功,特別是處理外部數據的函數是不健康的。另外,什麼是崩潰位置?這是發生事故時首先要了解的事情,但您對此話題保持沉默。 – atzz 2011-03-22 12:13:28

+0

@ user596691 - 如果你重寫你的代碼來使用vector而不是map,你可能碰巧掩蓋了真正的問題,但它仍然會存在。我知道,它是一個現代的SW dev範例:進行隨機更改,直到它編譯並顯示工作。這就是現代SW工程最糟糕的部分誕生的原因。除非你的生活依賴它,否則請不要這樣。 – atzz 2011-03-22 12:18:10

0

你有一個本地的Foo:

map<short,foo> foos; 

但後來你用這個 - > FOOS存儲棒

this->foos[barID] = bar; 

而且,地圖存儲富,而不是foo *