2016-04-20 11 views
2

ich Debian bin mit und habe ein seeeehr einfachen Datei-Parsing-Programm in C geschrieben Die Datei, die ich über 32k Zeilen lang öffnen will, ist, mit einem strengen Format:Dateideskriptor verschwindender/zunichte gemacht

number,number\n 
number,number\n 
and so on ... 

Mein Code :

int main(int argc, char* argv[]) 
{ 
    char data = 0; 
    int addr = 0; 
    char buf[50] = {0}; 

    FILE* myfile = fopen("eelocdump.txt", "r"); 

    if(myfile == NULL) 
    { 
     printf("File open error\n"); 
     return 1; 
    } 

    while (fgets(buf, 50, myfile) != NULL) 
    { 
     sscanf(buf, "%5d,%3d\n", &addr, &data); 
     printf("%d,%d\n", addr, data); 
    } 

    fclose(myfile); 

    return 0; 
} 

Für einige ungerade Gründen, die ich nicht verstehe, liest mein Code, um die erste Zeile der Datei, schreibt es aus, dann segfaults. Nach ungefähr einer Stunde, die ich damit verbracht habe, habe ich herausgefunden, dass der Aufruf von sscanf den Dateideskriptor auf NULL gesetzt hat.

Ich habe ein „fix“ gefunden, dass ich kaum zu nennen wagen so:

while (fgets(buf, 50, myfile) != NULL) 
    { 
     sscanf(buf, "%5d,%3d\n", &addr, &data); 
     printf("%d,%d\n", addr, data); 

     myfile = myfile; 
    } 

diese offensichtliche Erklärung Hinzufügen von meinen Code Arbeit macht, alle 32k Linien auszuschreiben. Dies ist alles andere als befriedigend, da dies nichts ändern sollte. (noch sollte sscanf den Dateideskriptor beeinflussen)

Könnten Sie mir bitte helfen, dieses Problem richtig zu lösen? Ich mag die Idee nicht, es "magic" zu nennen.

Vielen Dank im Voraus,

+4

'char Daten = 0;' -> 'int Daten = 0;' weil '% 3d' für int. – BLUEPIXY

+0

Ich habe mit gcc getestet und es funktioniert gut ('gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4') – BlackBear

+0

kompilieren Sie es mit' -Wall' '-Wextra' gcc sollte vor falscher Verwendung von' scanf warnen 'und' printf' – fghj

Antwort

2

Diese Zeilen sind inkonsistent.

char data = 0; 
/* ... */ 
    sscanf(buf, "%5d,%3d\n", &addr, &data); 

data ist ein char, es ist also 1 Byte Speicher. Sie laufen auf Linux, wenn Sie eine 64-Bit-Maschine haben, int ist wahrscheinlich 8 Bytes. So hat Ihr sscanf() einen Speicherüberlauf, der alles tun kann: Überschreiben anderer Variablen, Korrumpieren des Stapels, etc ... Das Setzen einer anderen Variablen auf null ist wahrscheinlich eine der weniger katastrophalen Dinge, die es tun kann.

+0

Wie BLUEPIXY zuvor erwähnt, korrigieren. Danke für die zusätzliche Erklärung. :) – Domack

Verwandte Themen