fread liest nur bis \0 ein!
-
Guten Tag,
ich habe im Studium eine Programmieraufgabe in der ein verschlüsselter Text entschlüsselt werden soll. Der verschlüsselte Text liegt als binärdatei vor. Er ist so ca 5000 Zeichen lang. Am 231ten Zeichen steht eine 00 (hexadezimal) was das Nullzeichen ist. Das dient in C als Markierung für das Ende einer Zeichenkette.
Das Problem ist jetzt folgendes: ich öffne die Datei und will sie mit fread auslesen. fread liest aber nur bis zum 230 Zeichen aus, da es denkt die Zeichenkette ist zu Ende...
Gibt es einen Weg die ganze Datei auszulesen und nicht nur die ersten 230 Zeichen?
Vielen Dank für die Antworten und einen traumhaften Tag!
Paul
-
fread
liest Daten, keine C-Strings. Darum istfread
die '\0' egal.Wie öffnest du die Datei?
Wie ist der Aufruf vonfread
bei dir?
(Bitte mehr Code als nur eine Zeile)
-
Hallo,
danke erstmal für die schnelle Antwort!
hier der Code:
unsigned char* Get_ciphertxt(unsigned char *filename) { unsigned char *ciphertxt; FILE* fp; if(filename == NULL){ printf("NULL pointer reference detected...\n"); } fp = fopen(filename, "r"); long filesize = GetFileLength(fp); ciphertxt = (unsigned char*)malloc((filesize)*sizeof(unsigned char)); fread(ciphertxt, 1,filesize, fp); fclose(fp); return ciphertxt; }
edit:
Filesize = 52656
und der char den ich zurückbekomme ist 231 Zeichen lang.
-
Gibt denn GetFileLength den richtigen Wert zurück?
Öffne die Datei besser im Binary-Modus und
werte auch den Rückgabewert vonfread
aus.Es ist ja schön, dass du den Dateinamen zumindest auf NULL überprüfst, aber das Programm macht nach der Fehlermeldung munter weiter.
Und viel wichtiger wäre die Überprüfung des Erfolgs vonfopen
und vonmalloc
.
-
PaulSonne schrieb:
und der char den ich zurückbekomme ist 231 Zeichen lang.
Woher weißt du das?
strlen
ist nicht die richtige Funktion dafür, denn die hört beim '\0' auf. Egal was dahinter ist.
-
PaulSonne schrieb:
und der char den ich zurückbekomme ist 231 Zeichen lang.
Und das ermittelst du bestimmt mit einer Funktion, die eigentlich für Strings gedacht ist und daher bei Nullbytes abbricht.
-
Im Augenblick hast du außerhalb der Funktion Get_ciphertxt keine Möglichkeit die Größe von dem Speicherbereich, auf den ciphertxt zeigt, zu ermitteln.
Das musst du mit zusätzlichen Funktionsparamtern machen.
-
DirkB schrieb:
PaulSonne schrieb:
und der char den ich zurückbekomme ist 231 Zeichen lang.
Woher weißt du das?
strlen
ist nicht die richtige Funktion dafür, denn die hört beim '\0' auf. Egal was dahinter ist.Ja das ist mir bewusst. Da ich mit Binärdatein arbeite lasse ich mir die Ausgaben per hexdump anzeigen. Wenn ich eine andere Binärdatei mit ca der selben länge nehme, passiert genau das selbe wenn fread auf 00 trifft.
-
DirkB schrieb:
Im Augenblick hast du außerhalb der Funktion Get_ciphertxt keine Möglichkeit die Größe von dem Speicherbereich, auf den ciphertxt zeigt, zu ermitteln.
Das musst du mit zusätzlichen Funktionsparamtern machen.
Also, wie stellst du fest, wieviel Daten da drin sind?
Der Fehler liegt nicht am
fread
.
-
DirkB schrieb:
DirkB schrieb:
Im Augenblick hast du außerhalb der Funktion Get_ciphertxt keine Möglichkeit die Größe von dem Speicherbereich, auf den ciphertxt zeigt, zu ermitteln.
Das musst du mit zusätzlichen Funktionsparamtern machen.
Also, wie stellst du fest, wieviel Daten da drin sind?
Der Fehler liegt nicht am
fread
.aaah, verdammt...
ich habe folgende Funktion benutzt;
BIO_dump_fp (stdout, (unsigned char *) ciphertxt, strlen(ciphertxt));
um mir den Hexdump anzuzeigen... habe ganz übersehen das ich ja strlen mit drin habe. Kein Wunder. Also, die Funktion klappt einwandfrei. bekomme das richtige Ergebniss angezeigt wenn ich:
BIO_dump_fp (stdout, (unsigned char *) ciphertxt, filesize);
nehme.
Sry für meine Blödheit und danke für die schnelle Hilfe!!
-
Beachte aber trotzdem die Hinweise von https://www.c-plusplus.net/forum/p2456552#2456552 (15:24:31 12.06.2015)
-
Bereits erledigt. Danke nochmal!