2016-07-07 51 views
0

我有一個CSVReader類,它有這個功能爲什麼Utf8Char的向量值正在改變?

vector<UtfChar*> CSVFile::ReadFile(FILE* fp) 
{ 
    //int count = 0; 
    Utf8Char buff[256]; 

    fgets(buff, 256, (FILE*)fp); 
     // count++; 

    Utf8Char *token = strtok(buff, ","); 
    bvector<UtfChar*> localVec; 
    while (token != NULL) 
    { 
     localVec.push_back(token); 
     token = strtok(NULL, ","); 
    } 
    return localVec; 
} 

現在我有另一個類,從中我調用這個函數:

FILE *fp; 
fp = fopen("SampleFile.csv", "r"); 
while((getc(fp)) != EOF) 
{ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

我在這裏比較localVec值與一些集價值(char*)我有。但在另一個類中,當我嘗試訪問像localVec[0]或l ocalVec[1]這樣的向量時,它會給出垃圾。 我試着在CSVReader類中進行比較,然後在那裏工作。但是我需要在其他類中進行比較,以便我可以爲其他CSV文件使用相同的CSVReader類。

+3

指針和C函數。有什麼可以出錯的?這是因爲你使用了一個緩衝區,所有的矢量元素都引用它,然後它被破壞。請使用C++標準庫。 – LogicStuff

+0

它給了什麼樣的「垃圾」? Utf8Char是如何定義的? – user3684240

+0

@LogicStuff如果程序員不能學習局部變量的範圍以及如何處理簡單的指針,那麼使用C++標準庫是無濟於事的。 –

回答

2

這裏的問題是你有懸掛指針。創建和填充

Utf8Char buff[256]; 

fgets(buff, 256, (FILE*)fp); 

然後你得到指向該緩衝區的不同環節與

Utf8Char *token = strtok(buff, ","); 
bvector<UtfChar*> localVec; 
while (token != NULL) 
{ 
    localVec.push_back(token); 
    token = strtok(NULL, ","); 
} 

本地陣列所以,現在你有一個完整的指針向量本地緩存的每段。從函數返回向量後,本地緩衝區被破壞。這意味着你現在擁有的所有指針都指向你不再擁有的內存。使用這些指針是未定義的行爲,並且是得到垃圾輸出的原因。

另請注意,如果您使用How can I read and parse CSV files in C++?解析CSV文件,則可以避免使用所有這些C-ism。

+0

感謝彌敦道:) – Logan0486

1

此代碼

bvector<UtfChar*> localVec; 

意味着你存儲指針在您的載體。

那些指針指向一個局部變量當函數返回時超出範圍。

0

看起來你跳過每個字符串的第一個字符從文件中讀取:

while((getc(fp)) != EOF){ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

它是故意的嗎?如果是這樣,那麼問題在於:UTF-8字符可以具有可變長度(例如一些用1字節表示,其他用2字節等等,最多6字節)。如果你不做任何字符串轉換,你可以將UTF-8字符串逐字節地從一個地方複製到另一個地方,而不用擔心字符長度,因爲字符串將保持有效。但是如果你從字符串中切掉第一個字節,那麼它就不再是一個有效的UTF-8字符串,並且不能像它那樣被解釋。

+0

沒有它不是故意的。如何避免它..謝謝BTW – Logan0486

相關問題