2010-04-08 47 views
0

我有一段隨機代碼,用於從CSV文件中讀取...並且很好...直到大約2000年後讀取...然後getline行失敗,並且訪問衝突爲0xcccccc ...我假設輸入流(文件)已被清除...不是我知道爲什麼:)爲什麼會出現訪問衝突到0xcccccc ...?

int CCSVManager::ReadCSVLine (fstream * fsInputFile, 
           vector <string> * recordData) 
{ 
    string s; 

    getline (*fsInputFile, s); 
    stringstream iss(s); 

    for (unsigned int i = 0; i < getNumFields(); i++) 
    { 
     getline (iss, s, ','); 
     (*recordData)[i] = s; 
    } 

    return 0; 
} 

任何想法爲什麼?

+0

你的向量的大小應該修改,很可能是失敗的原因。 – lsalamon 2010-04-08 18:51:10

回答

3

您確定recordData有足夠空間容納所有記錄嗎?它應該看起來像這樣:

for (unsigned int i = 0; i < getNumFields() && i < recordData->size() && getline(iss, s, ','); i++) 
{ 
    (*recordData)[i] = s; 
} 
2

如果(*recordData).size() < getNumFields()可能會損壞內存。考慮消除getNumFields並依靠(*recordData).size()來存儲該信息。或者,不要預設矢量的大小,並使用push_back

避免指針,也與參考。

int CCSVManager::ReadCSVLine (fstream &fsInputFile, vector <string> &recordData) 
{ 
string s; 

getline (fsInputFile, s); 
istringstream iss(s); 

for (unsigned int i = 0; i < getNumFields(); i++) 
{ 
    getline (iss, s, ','); 
    recordData.push_back(s); 
} 

return 0; 
    } 
+0

+1而不是指針。 (+1將在5小時後生效。) – GManNickG 2010-04-08 19:09:06

+0

約8小時,但whatev。 :) – GManNickG 2010-04-09 03:34:06

0

is getNumFields();改變。這看起來像是每次都重新計算。移動該循環的外側

5

std::vector當您以類似數組的形式訪問它時,不會重新分配自身以進行擴展。你應該做的

(*recordData)[i] = s; 

反而是

recordData->push_back(s); 

這將在必要時擴大載體。這兩種方法之間的一個重要區別是,第一種方法將始終從矢量的第一個元素開始寫入。第二個將開始附加到向量的末尾,如果向量不是最初是空的,則向量是不同的。

+0

使用recordData-> clear()作爲第一個操作是,否則向量大小將繼續增長 – 2010-04-08 19:03:58

0

我的猜測是getNumFields()返回的數字大於文件中的行數。

該文件包含多少行/記錄?

getNumFields()返回什麼?

0

Argh ... 所有非常好的答案,但它實際上是遠遠更遠的東西。感謝你的回答,我開始尋找一些代碼的「其他」部分,並且我意識到我做錯了什麼:)(它實際上是傳入的文件是空白的,我沒有意識到它正在重新打開文件每次和超載文件矢量...這種低級錯誤了:))

謝謝您的回答:)不過讓我給我的解決方案:)

1

通話如下之前的聲明,以確保矢量具有足夠的元素。

recordData->resize(getNumFields()); 
+0

您的意思是'resize'。 – UncleBens 2010-04-08 19:16:35

+0

我的意思是調整大小,謝謝指出。 – 2010-04-08 20:02:12

相關問題