2016-07-24 32 views
-1

Ich habe einige Code, der eine char * in eine binäre Datei schreibt wie folgt:Schreiben Strings binäre Dateien in C

FILE *fp = fopen(path, "wb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 

fwrite("Hello", 6, 1, fp); 

Das Problem ist, dass, wenn ich dann aus dieser Datei lesen sich wie so:

FILE *fp = fopen(path, "rb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 


char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

Ich bekomme unterschiedliche Ergebnisse z Oello oder Mello. Was ist los?

+0

Sie setzen nie den 'char * str' oder bin ich falsch? –

+2

Geben Sie ** all ** Ihren Code ein. In Ihrem geposteten Code lesen Sie in 'id': 'fread (id, 6, 1, fp);' (* vielleicht * lesen - Sie überprüfen nicht den Rückgabewert ...), aber Sie geben den Inhalt von was auch immer aus Die nicht initialisierte Variable 'str' zeigt auf:' printf ("Got str:% s \ n", str); ' –

+0

Sorry, das war ein Tippfehler. Ich lese in die Variable str. Die ID stammt von einer früheren Implementierung, die ich in str geändert habe, damit ich testen konnte, was falsch lief. –

Antwort

1

Dieser Code ist falsch:

char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

char *str; einen Zeiger uninitialized Charakter schafft. Wo ist die Erinnerung, auf die es hinweist?

char str[ 7 ]; 
fread(str, sizeof(str) - 1, 1, fp); 
str[ sizeof(str) - 1 ] = '\0'; 
printf("Got str: %s\n", str); 

wäre besser, obwohl es immer noch nicht den Rückgabewert von fread() überprüft Daten, um sicherzustellen, tatsächlich gelesen wird.

+0

Ahh. Ja mein Schlechter. Ich nahm an, dass der Speicher, der dem Zeiger folgt, sicher von 'read' bevölkert würde. Also würde 'read' das Char-Array erzeugen und den str * darauf setzen. –

0

Sie haben nicht zugewiesenen Speicher für str

char *str ; // You haven't allocated memory for it , Do 
str=malloc(6*sizeof *str); 

Dann tun

fread(str, 6, 1, fp); 

Auch, wenn die Schreib- und Lese in derselben Übersetzungseinheit passiert, sollten Sie

fclose(fp); // to flush the output buffer and close the file descriptor 
tun

vor dem Lesen aus der Datei