2016-03-28 6 views
0

Ich habe den folgenden Code:Lesedatei in eine Struktur stoppt manchmal ohne Grund

int main() {  
    FILE *fp = fopen("inventory.txt", "r"); 
    if (fp == NULL) { 
     printf("File Error"); 
     return 1; 
    } 

    while (1) { 
     char *componentType = malloc(200); 
     char *stockCode = malloc(20); 
     int numberOfItems = 0; 
     int price = 0; 
     char *additionalInformation = malloc(20); 

     int fileRead = fscanf(fp, "%[^,], %[^,], %i, %i, %[^,\r\n]", componentType, stockCode, &numberOfItems, &price, 
           additionalInformation); 

     if (fileRead == EOF) { 
      printf("End of file!\n"); 
      break; 
     } 

     printf("%s Read Record!\n", stockCode); 

     free(componentType); 
     free(stockCode); 
     free(additionalInformation); 
    } 

    printf("DONE!"); 
    fclose(fp); 

} 

Die Datei sieht wie folgt aus:

resistor, RES_1R0, 41, 1, 1R0 
resistor, RES_10R, 467, 1, 10R 
resistor, RES_100R, 334, 1, 100R 
resistor, RES_1K0, 500, 1, 1K0 
resistor, RES_10K, 169, 1, 10K 
resistor, RES_100K, 724, 1, 100K 
resistor, RES_1M0, 478, 1, 1M0 
diode, BY126, 118, 12 
diode, BY127, 45, 12 
transistor, AC125, 13, 35, PNP 
transistor, AC126, 40, 37, PNP 
.... 

Allerdings, wenn ich führen Sie den Code es manchmal wie abgeschlossen dies:

RES_1R0 Read Record! 
RES_10R Read Record! 
... 
CF12 Read Record! 
CF13 Read Record! 
Done! 

Aber manchmal hält es ohne Grund so:

RES_1R0 Read Record! 
RES_10R Read Record! 
... 
D12 Read Record! 
D13 Read 

Jedes Mal, es gibt immer noch 0.

Was ist das Problem?

+2

Leckt Ihr realer Code Speicher wie im Beispiel gezeigt? Oder dient es nur der Veranschaulichung? Und wie viele Zeilen enthält Ihre Eingabedatei - um herauszufinden, wie viel Speicher Sie tatsächlich zuweisen. Überprüfen Sie als Erstes alle Rückgabewerte von "malloc", um zu überprüfen, ob eine Zuordnung fehlschlägt. – kaylum

+0

Ja, es leckt wie im obigen Beispiel. Allerdings habe ich "..." verwendet, da ich natürlich nicht alle zeigen konnte. Es gibt 299 Datensätze! –

+0

probiere '% [^, \ r \ n]' -> '% [^, \ r \ n]% * c' – BLUEPIXY

Antwort

0

Da sich diese Frage nun so sehr geändert hat, dass ich sie zuerst gestellt habe (dh zuerst dachte ich, dies sei ein Speicher/Struct-Problem, dann wurde es ein Compiler-Problem, dann fand ich heraus, dass es ein IDE-Problem war) Ich habe mich entschieden, eine neue Frage zu stellen: Output for CLion IDE sometimes cuts off when executing a program.

Die Antwort für diese spezielle Frage ist, dass dies ein Problem mit der CLion IDE ist. Um dieses Problem zu beheben, kompilieren und führen Sie den Code mit einem Terminal aus, und die Ausgabe funktioniert einwandfrei.

Dank @Dominik Gebhar & @ Jonathan Leffler für die Hilfe !!!

-1

fscanf() die Anzahl der Zeichen zurückkehrt gelesen oder Null am Ende der Datei, während fgetc (fp) ein Zeichen oder EOF zurückgibt, wenn das Ende der Datei erreicht ist.

Sie mischen die beiden Erkennungsmethoden.

+2

"scanf() gibt Null am Ende der Datei zurück". "Ja wirklich?" Die [fscanf-man-Seite sagt] (http://linux.die.net/man/3/fscanf): "Der Wert EOF wird zurückgegeben, wenn das Ende der Eingabe erreicht ist". – kaylum

+0

'fscanf()' gibt die Anzahl der erfolgreich bearbeiteten Konvertierungsspezifikationen zurück, wobei die Zahl 0 oder mehr sein kann; oder es gibt EOF zurück, wenn es bei EOF positioniert ist (es gibt keine weiteren Daten in der Datei) oder wenn ein E/A-Fehler vorliegt. Es gibt nicht die Anzahl der gelesenen Zeichen zurück. Wenn die Formatzeichenfolge 6 Konvertierungsangaben (% s oder ähnlich) ohne Zuweisungsunterdrückung (nicht% s) hat, dann suchen Sie nach 6, die zurückgegeben werden sollen. alles weniger deutet auf ein Problem hin. –