2016-09-04 5 views
-3

Ich lese eine Zeichenfolge aus einer Datei. Nach dem zweiten oder dritten Mal, wenn die Funktion ausgeführt wird, werden ein oder mehrere zufällige Zeichen an die Pufferzeichenfolge angehängt und ich habe keine Ahnung, warum dies geschieht.Lesen von Datei fehlschlägt

Hier ist das Stück Code:

scorefile = fopen("highscore.dat", "rb"); 

if (scorefile) 
{ 
    fseek(scorefile, 0, SEEK_END); 
    length = ftell(scorefile); 
    fseek(scorefile, 0, SEEK_SET); 
    buffer = malloc(length); 
    if (buffer) 
    { 
     fread(buffer, 1, length, scorefile); 
    } 
    fclose(scorefile); 
} 

Bin ich hier etwas falsch zu machen?

+1

Wie über einige Debug und/oder Umsetzung proper [Fehlerbehandlung] tun (http://stackoverflow.com/questions/21267716/error- Handling-in-Datei-Öffnung)? –

+0

"printf" du die Ergebnisse von 'hiscore.dat'? –

+3

Meine Kristallkugel denkt, dass Sie "Puffer" als Null-terminierte Zeichenfolge behandeln, was nicht der Fall ist (es sei denn, Ihre Datei hat am Ende eine Null). – molbdnilo

Antwort

0

Wenn Sie buffer = malloc(length); verwenden und dann length Bytes darin lesen, wird es ein Byte zu kurz sein. Char-Arrays in C sind Null-terminiert, so dass sie ein zusätzliches Byte bis zu dieser Null benötigen. buffer = malloc(length+1); wird das beheben.

+0

Hat es leider nicht. – Kai

1

wir buchstabieren sie alle aus und gehen etwas robuster:

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

char *loadScoreFile(const char *filename) 
{ 
    char *buffer = NULL; 

    FILE *scorefile = fopen(filename, "r"); 

    if (scorefile != NULL) 
    { 
     (void) fseek(scorefile, 0, SEEK_END); 
     int length = ftell(scorefile); 

     (void) fseek(scorefile, 0, SEEK_SET); 

     buffer = malloc(length + 1); 

     if (buffer != NULL) 
     { 
      assert(length == fread(buffer, 1, length, scorefile)); 

      buffer[length] = '\0'; 
     } 
     (void) fclose(scorefile); 
    } 

    return buffer; 
} 

int main() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     char *pointer = loadScoreFile("highscore.dat"); 

     if (pointer != NULL) 
     { 
      printf("%s", pointer); 
      free(pointer); 
     } 
    } 

    return 0; 
} 
+0

Der Inhalt der Scorefile ist "10-Test"; und das Ergebnis des Drucks ist: http://prntscr.com/ce6lmt – Kai

+0

@Kai, das Ausführen des obigen Codes unverändert ist? Ich habe es mit dem Inhalt, den du erwähnt hast, gemacht und immer "10-Test" bekommen; über und über.Sie könnten versuchen, den offenen Modus von "rb" auf "r" zu ändern, da wir gerade Text lesen und sehen, ob das einen Unterschied macht. Ansonsten weiß ich es nicht. Sie können nach SO für "fopen Windows" suchen, um zu sehen, ob es bekannte Störungen gibt. – cdlane

+0

könnte es sein, dass vielleicht etwas anderes in meinem Programm das verursachen könnte? Wie ein Käfer woanders und ich sehe nur die Ursache hier. Schließlich versuche ich wirklich nur Text aus einer Datei zu lesen - keine Ahnung, warum es so verflucht aussieht ... – Kai