null-terminierte Konfusion
-
Hallo zusammen!
Zunächst einmal - dies ist mein erster Post hier, also ein sehr denkwürdiges und emotionales Ereignis für mich, das meine spätere Entwicklung in diesem Forum maßgeblich beeinflussen kann und wird - deshalb bitte ich darum, keine Texte zu verfassen, die ein evenvuelle späterer Traumata verursachen könnten.
Naja.. im Ernst, ich würde mich sehr gern mit einer Frage an Euch wenden, die ich mir selbst nicht so ganz beantworten kann.
Und zwar geht es um Folgendes:
Ich möchte n Bytes aus einer Datei auslesen, die einen String repräsentieren. Dazu nutze ich fread(). Da der String in der Datei selbst nicht null-terminiert ist, füge ich den Terminator nach dem Einlesen der Bytes aus der Datei zusätzlich hinten an. Das Ganze sieht dann ungefähr so aus:
char*buf=(char*)malloc(length+1); fread(&buf[0], length, 1,m_file); buf[length]='\0'; printf("String: %s", buf);Leider wird der String am Ende nicht korrekt ausgegeben, genauer genommen gar nicht. Wenn ich allerdings die einzelnen Array-Positionen in einer Schleife ausgebe, dann sehe ich, daß die einzelnen Chars richtig eingelesen wurden aus der Datei.
Im Moment umgehe ich das Problem folgendermaßen:
char*buf=(char*)malloc(length); char*result=new char[length]; sprintf(result,""); fread(&buf[0], length, 1,m_file); for(int i=0;i<length;i++) sprintf(result, "%s%c", result, buf[i]); return result;Ich lese also den Dateiinhalt in buf ein und kopiere ihn dann wiederum Byte für Byte nach result. Funktioniert zwar, ist aber nicht das Gelbe vom Ei. Lieber wäre mir die o.g. Lösung.
Daher meine Frage an Euch: Könnt ihr mir da vielleicht weiterhelfen?
Vielen Dank für jede Hilfe!
TdZ
-
Es tut mir leid das schreiben zu müssen, aber der Code von dir ist kein bisschen C++, sondern reines C^^
Dementsprechend gehört er auch in ein anderes Forum, wo ein Mod ihn sicher bald verschieben wird^^
-
Ich kann in deinem oberen Code keinen Fehler entdecken. Kannst du ein bisschen mehr Code posten, vorallem, wie du die Datei öffnest?
Noch ein paar HInweise:fread(&buf[0], length, 1,m_file);ist aufgrund der Natur von Arrays in C gleichbedeutend mit
fread(buf, length, 1,m_file);Diese beiden Zeilen machen exakt das gleiche:
char*buf=(char*)malloc(length); char*result=new char[length];Die erste ist die C-Variante, die zweite das Equivalent in C++.
@The-Kenny: Durch das "new" wird's doch zu C++

Grüße,
Martin
-
Sorry, daß ich jetzt erst antworte, aber ich hatt in den letzten Tagen Probleme, den Server hier zu erreichen.
@TheKenny
Stimmt, da hast du eigentlich recht. Ich hab ehrlich gesagt nur nicht drauf geachtet, weil das Projekt ansich in C++ gehalten ist, bis auf einige (plattformspezifisch in C gehaltene) Ausnahmen. Trotzdem, mein Fehler.@JimmydaMage
Eigentlich ist das alles an Code, der relevant wäre. Davor kommt einzig noch einfopen(filename,"rb");Benutze jetzt immernoch diesen vermkurksten Code, daher hoffe ich, euch fällt vielleicht noch was ein. Ich jedenfalls bin nach wie vor ratlos was das angeht.
-
TdZ schrieb:
char*buf=(char*)malloc(length); char*result=new char[length]; sprintf(result,""); fread(&buf[0], length, 1,m_file); for(int i=0;i<length;i++) sprintf(result, "%s%c", result, buf[i]); return result;Ich verstehe nicht ganz, was du erreichen willst... Also soll der Dateiinhalt in "buf" und in "result" drinstehen?
Egal wie, aber das char-weise kopieren sollte auf jeden Fall sofor ( int i=0; i<length+1; i++ ) result[i] = buf[i];oder so
memcpy( result, buf, length+1 );aussehen!
-
was für eine datei öffnest du denn? ein normales textfile oder ne .exe oder ...? weil bei vielen gibts vornedran noch header, die schon nullbytes enthalten können und den string deshalb abschneiden.
-
Schau dir am besten mal im Debuuger an, wie buf nach dem Anhängen des Nullbytes aussieht. Das beschriebene Verhalten klingt danach, dass in der Datei vor der String noch ein Nullbyte steht...
GRüße,
Martin
-
JimmydaMage schrieb:
Das beschriebene Verhalten klingt danach, dass in der Datei vor der String noch ein Nullbyte steht...
Ja, das würde auch erklären warum die "sprintf-Kopierschleife" funktioniert... die "schluckt" sämtliche Nullbytes.