2017-06-08 1 views
2

Also, ich bin ziemlich neu in C und rannte über etwas vor ein paar Stunden, dass ich dachte, war rätselhaft.Array of Structs Wert verloren im Speicher

Ich arbeite im Grunde an einem csv-Dateiparser in C. Ich habe die folgende Struktur für einen einzelnen Wert aus einer CSV-Datei. (zB "5.13" oder "Test1").

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

Inneren des Haupt ist die folgende (Anmerkung: Die Linien 40 und 41 sind die wichtigen):

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 ; 
} 

Der Punkt dieses Codes ist in Werte aus einer CSV-Datei zu lesen und jeder speichern von ihnen in einer Instanz von CSV_DATA. Ich speichere diesen Wert dann in einem 2D-Array, um später auf die Daten zugreifen zu können.

Jetzt speichert das tatsächlich Werte in Speicher. Ich weiß, weil ich sie mit GDB sehen kann, aber das Problem ist, dass die Daten im Speicher vom tatsächlichen Index des Arrays versetzt sind.

folgenden Befehl ein: x/200ub csv_data ... yeilds folgendes:

(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 

Ähnlich x/200ub csv_data [0] ergibt sich die gleiche Sache ... wie erwartet.

Allerdings sucht x/200ub csv_data [1] den falschen Index im Speicher für die Werte !! Allerdings kann ich sie im Speicher gespeichert sehen, aber der Index des Arrays wird auf den falschen Speicherort für 1..n verwiesen. Irgendwelche Vorschläge oder Ideen würden sehr geschätzt werden!

+3

Sie nicht '0' Zeichenfolge in 'cval' – mch

+5

' int j = 0 beenden; 'in nur 1 Orte wirken verdächtig. Ich würde es erwarten, bevor 'while (record! = NULL)' – chux

+0

thx mch. Ich werde das untersuchen. – Killingsworth

Antwort

1

Inner Loop-Index wird nur einmal initialisiert. Bewegen j Index

Andere Ideen auch eingebaut

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; 
} 

[Bearbeiten] Korrigierte Code