Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit FileStream


HenryHux - Sa 19.02.11 22:53
Titel: Problem mit FileStream
Hey, ich wollt mal kurz nachfragen, wie ich richtig mit TFileStream umgehe, denn bei mir gibt es einige Probleme.
Entweder er schreibt nicht den komplette String, oder der String ist total durchpflückt von Leerzeichen :?!?:

Konstrukt sieht so aus :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var Stream : TFileStream;
    Text : String;
begin
  Stream := TFileStream.Create('C:\Users\Tobias\Desktop\Projekt\Version 1.0\'+
                                'Debug\Win32\Log1.txt', fmOpenReadWrite);
  Text := 'Hi, ein kleiner test';
  Stream.Write(Pointer(text)^, Length(text));
  Stream.Free;
end;


Hab kp -.-

Lg


jaenicke - Sa 19.02.11 23:01

Du solltest nicht vergessen, dass Delphi XE (wie in deinem Profil steht) Unicode verwendet. Dementsprechend schreibst du nur den halben String (da jedes Zeichen 2 Byte hat, du aber nur Length Bytes schreibst), zudem ist jedes zweite Byte bei lateinischen Buchstaben Null (was du wohl umgangssprachlich mit Leerzeichen meinst).

Du könntest entweder die Größe in Bytes korrekt berechnen (Length(Text) * SizeOf(Char)) oder TStringStream verwenden oder AnsiStrings statt UnicodeStrings.


HenryHux - Sa 19.02.11 23:06

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du solltest nicht vergessen, dass Delphi XE (wie in deinem Profil steht) Unicode verwendet. Dementsprechend schreibst du nur den halben String (da jedes Zeichen 2 Byte hat, du aber nur Length Bytes schreibst), zudem ist jedes zweite Byte bei lateinischen Buchstaben Null (was du wohl umgangssprachlich mit Leerzeichen meinst).

Du könntest entweder die Größe in Bytes korrekt berechnen (Length(Text) * SizeOf(Char)) oder TStringStream verwenden oder AnsiStrings statt UnicodeStrings.


:flehan: :flehan: :flehan: :flehan: :flehan:

Danke, das wär das Letzte auf das ich gekommen wäre :D
Habe mich jetzt für TStringStream entschieden.

Danke!

Edit : Was mich noch interessiert, wie mache ich einen ZeilenUmsprung?
Edit2 : Probiert und klappt mit #13#10; =)


Gerd Kayser - So 20.02.11 03:04

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Text : String;                    
Mach einen AnsiString daraus.
Edit: Sorry, hatte die anderen Beiträge übersehen.


Delete - So 20.02.11 03:12

Warum denn das? Lange wurde nach einer Unicode-Unterstützung geschrien und jetzt, wenn es Probleme mit Unicode gibt, aus Unwissenheit, dann wird immer vorgeschlagen wieder einen AnsiString zu nehmen. Wozu dann bitte die Unicode-Unterstützung, wenn man sie dann doch nicht nutzt? :roll:


Gerd Kayser - So 20.02.11 04:48

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Warum denn das? Lange wurde nach einer Unicode-Unterstützung geschrien und jetzt, wenn es Probleme mit Unicode gibt, aus Unwissenheit, dann wird immer vorgeschlagen wieder einen AnsiString zu nehmen. Wozu dann bitte die Unicode-Unterstützung, wenn man sie dann doch nicht nutzt? :roll:

Es ist ja schön, daß z. B. XE Unicode unterstützt. Aber das heißt ja nicht, daß man fortan nur noch Unicode verwenden muß oder darf. Es gibt sicherlich Gründe, die für die Verwendung von Unicode sprechen, aber es gibt auch gute Gründe dagegen. Zum Beispiel einen Lieblingseditor, der noch kein Unicode unterstützt. Die Fehlerbeschreibung von HenryHux deute ich jedenfalls so.


jaenicke - So 20.02.11 08:09

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Zum Beispiel einen Lieblingseditor, der noch kein Unicode unterstützt. Die Fehlerbeschreibung von HenryHux deute ich jedenfalls so.
Manche erwarten auch nur ein BOM am Anfang der Datei.

Wie dem auch sei, wenn es wirklich um eine Logdatei geht, wäre AssignFile + Rewrite/Append + WriteLn + CloseFile wohl besser geeignet. Denn darauf deutet ja die Frage nach dem Zeilenumbruch hin.


HenryHux - So 20.02.11 11:41

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Wie dem auch sei, wenn es wirklich um eine Logdatei geht, wäre AssignFile + Rewrite/Append + WriteLn + CloseFile wohl besser geeignet. Denn darauf deutet ja die Frage nach dem Zeilenumbruch hin.


Hatte ich vorher auch benutzt. Wollte aber mal probieren, wie das mit dem FileStreaming so funktioniert.
U.a auch, da oft wenn ich das Programm beende er eine Zeile nicht fertiggeschrieben hat.
Gleiches "Problem" aber auch mit FileStream. Naja werd ich mit leben können/müssen :D

Lg


jaenicke - So 20.02.11 11:48

Wenn das Programm normal beendet wird, dann wurde der FileStream nicht korrekt freigegeben.

Wenn das Programm abstürzt, hilft nur, die Datei aus dem Speicher zu flushen. Das geht bei MMFs gut (FlushViewOfFile oder so). Bei AssignFile öffne und schließe ich die Datei einfach jedesmal, dann ist auch alles drin.