Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 19.02.11 22:53 
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 :
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: HenryHux
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: So 20.02.11 03:04 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
Text : String;					
Mach einen AnsiString daraus.
Edit: Sorry, hatte die anderen Beiträge übersehen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.