2017-06-08 29 views
2

因此,我對C非常陌生,幾個小時前碰到了一些我認爲令人費解的東西。結構陣列值在內存中丟失

我基本上在C中的csv文件解析器上工作。我有以下結構來保存csv文件中的單個值。 (例如「5.13」或「Test1」)。

struct CSV_DATA { 
    enum { is_int, is_float, is_char } type; 
    int ival; 
    char cval[10]; 
    float fval; 
}; 

裏面主要是下面的(注:線40和41是重要的):

int main() 
{ 

    struct CSV_DATA csv_data[500][50]; 

    char buffer[1024] ; 
    char *record,*line; 

    int i = 0; 
    int j = 0; 

    FILE *fstream = fopen("iris.csv","r"); 

    if(fstream == NULL) 
    { 
     printf("\n file opening failed "); 
     return -1 ; 
    } 

    while((line=fgets(buffer,sizeof(buffer),fstream))!=NULL) 
    { 
    record = strtok(line,","); 
    printf("%s", record); 
    while(record != NULL) 
    { 

     csv_data[i][j].type = is_char; 
     for (int k=0; k < strlen(record); k++){ 
      csv_data[i][j].cval[k] = record[k];//record;   
     } 

     j++; 

    record = strtok(NULL,","); 
    printf("%s", record); 

    } 
    ++i; 
    } 




    return 0 ; 
} 

此代碼的點是從csv文件中值,以讀取和存儲每一個其中一個CSV_DATA實例。然後我將該值存儲在一個2d數組中,以便稍後能夠訪問數據。

現在,這實際上將值存儲到內存中。我知道,因爲我可以用GDB看到它們,但問題是數據是從數組實際索引的內存中偏移的。

以下命令:x/200ub csv_data ... yeilds以下:

(gdb) x/200ub csv_data 
0x7ffffff6b1f0: 2 0 0 0 0 0 0 0 
0x7ffffff6b1f8: 53 46 49 0 0 0 0 0 
0x7ffffff6b200: 0 0 0 0 0 0 0 0 
0x7ffffff6b208: 2 0 0 0 0 0 0 0 
0x7ffffff6b210: 51 46 53 0 0 0 0 0 
0x7ffffff6b218: 0 0 0 0 0 0 0 0 

類似地,X/200ub csv_data [0]產生如預期同樣的事情...。

但是,x/200ub csv_data [1]正在查看內存中錯誤的索引值!但是,我可以看到它們存儲在內存中,但數組的索引指向1..n的錯誤內存位置。任何建議或意見將不勝感激!

+3

你沒有'0' – mch

+5

'INT J = 0終止您的字符串'cval';'只有1地方看起來很可疑。我期望它在'while(record!= NULL)' – chux

+0

thx mch之前。我會研究這個。 – Killingsworth

回答

1

內部循環索引僅初始化一次。移動j指數

其他想法納入太

int main() { 
    struct CSV_DATA csv_data[500][50]; 
    char buffer[1024]; 

    // **FROM** 
    // int j = 0; 
    size_t i = 0; 

    FILE *fstream = fopen("iris.csv", "r"); 

    if (fstream == NULL) { 
    printf("\n file opening failed "); 
    return -1; 
    } 

    while (fgets(buffer, sizeof buffer, fstream)) { 
    char *record = strtok(buffer, ","); 

    // **TO** 
    size_t j = 0; 

    while (record) { 
     printf("%s", record); 
     csv_data[i][j].type = is_char; 

     csv_data[i][j].cval[0] = `\0`; 
     // strncat(csv_data[i][j].cval, record, sizeof csv_data[i][j].cval); 
     strncat(csv_data[i][j].cval, record, sizeof csv_data[i][j].cval - 1); 
     j++; 

     record = strtok(NULL, ","); 
    } 
    ++i; 
    } 
    fclose(fstream); // add 
    return 0; 
} 

[編輯]修正代碼