Hi,
es gibt ein paar Dinge, auf die du achten solltest. So kann ein
XML File UTF-8 oder UTF-16 kodiert sein.
Der C Code verwendet WChar, das würde ich doch einfach mal ein Array von Widechars (16 Bit) deuten, so dass hier immer von UTF-16 augegangen wird. Der normale Delphi String ist aber eine AnsiString, du solltest hier also lieber einen Widestring verwenden. Dabei gilt es dann zu beachten, dass du pro Zeichen 2 Byte hast, der also nur Stream.Size div 2 groß wird.
Den String s brauchst du zudem nicht mit '' initialisieren, wenn du danach die Länge veränderst. Da wird (
imho) der alte String dann eh verworfen und neuer Speicher alloziert (verworfen heißt nicht, dass der Inhalt nicht kopiert wird, aber du legst halt zwei mal Speicher an). Andererseits wird der Compiler das eh wegoptimieren (denke ich).
Was @s angeht, von dem Tipp würde ich dir abraten, da bekommst du nämlich die falsche Adresse. Wenn man Strings oder dyn. Arrays addressiert, dann sollte man immer den Index angeben. @s zeigt auf einen Teil, den du nicht beschreiben solltest.
@s[1] (Strings sind 1 indexiert) wäre dann eher korrekt. Ob man das bei Streams braucht oder nicht weiß ich gerade nicht (ich weiß dass ich hier schonmal den falschen Tipp gab und lasse ihn hier weg).
Ja, ansonsten sieht dass was du tust schon richtig aus. Allerdings gibt es da noch Potenzial etwas zu verbessern. Wenn du eine Datei zum Lesen öffnest, solltest du sie ruhig zum Schreiben sperren. Damit du lesen kannst musst du ein
Handle auf die Datei bekommen (macht der Stream aut.). Damit solltest du aber auch dafür sorgen, dass der Stream auf jedem Fall (auch bei einem Fehler) freigegeben wird. Deshalb gehört da ein so genannter Ressourcen-Schutzblock hin.
Und damit andere deinen Code leichter lesen können, solltest du die Codetags verwenden (die findest du über dem Edit in dem du einen Beitrag tippst). Da gibt es sowohl für C als auch für Delphi Code Auszeichnungen. Werden die verwendet, ist der Code als solcher markiert (und es gibt auch Syntaxhighlighting).
Delphi-Quellcode:
fStream := TFileStream.Create(A_PATH_TO_FILE + 'profile.prx', fmOpenRead or fmShareDenyWrite);
try
setLength(s, fStream.Size);
if not fStream.Read(s, fStream.Size) = fStream.Size then
begin
// Achtung, es wurden weniger Zeichen gelesen als du vorgegeben hast
end;
finally
fStream.Free;
end;
So sähe das mit Schutzblock aus, der stellt halt sicher, dass die Datei auf jeden Fall wieder frei gegeben wird.
Gruß Der Unwissende