AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TFileStream speichert nur Unsinn

Ein Thema von dGeek · begonnen am 19. Jul 2016 · letzter Beitrag vom 20. Jul 2016
Antwort Antwort
Seite 1 von 2  1 2   
dGeek
(Gast)

n/a Beiträge
 
#1

TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 17:29
Delphi-Version: XE2
Ich habe folgende Funktion, welche eigentlich einen simplen String mit einer Uhrzeit an eine Textdatei anhängen soll.

Delphi-Quellcode:
var
 aFileStream: TFileStream;
 aLogStr: String;
 aFileName: String;
begin
 aLogStr := DateTimeToStr(Now) + aSystemLogStr + sLineBreak;
 aFileName := vLogFile;

 if FileExists(aFileName) then
  aFileStream := TFileStream.Create(aFileName, fmOpenReadWrite)
 else
  aFileStream := TFileStream.Create(aFileName, fmCreate);

 try
  aFileStream.Seek(0, soEnd);
  aFileStream.WriteBuffer(Pointer(aLogStr)^, Length(aLogStr));
 finally
  aFileStream.Free;
 end;
end;
Das problem ist nun, dass der übergebene String erstens nicht komplett abgespeichert wird ud zweitens in der Datei überall NUL steht.

Bei folgender Variante verschwinden die NUL's, aber der übergebene String wird gar nicht gespeichert:
Delphi-Quellcode:
var
 aFileStream: TFileStream;
 aLogStr: String;
 aFileName: String;
begin
 // aStr z.B. == 'Programm gestartet".

 aLogStr := DateTimeToStr(Now) + ' | ' + aStr + sLineBreak;
 aFileName := vLogFile;

 if FileExists(aFileName) then
  aFileStream := TFileStream.Create(aFileName, fmOpenReadWrite)
 else
  aFileStream := TFileStream.Create(aFileName, fmCreate);

 try
  aFileStream.Seek(0, soEnd);
  aFileStream.WriteBuffer(Pointer(aLogStr)^, Length(aLogStr));
 finally
  aFileStream.Free;
 end;
end;
Was stimmt da nicht?
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#2

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 17:37
Warum nimmst du nicht einfach eine Stringlist? Die scheint mir dafür geeigneter bzw. einfacher.

Delphi-Quellcode:
var
  aStringList: TStringList;
  aLogStr: String;
  aFileName: String;
begin
  aLogStr := DateTimeToStr(Now) + aSystemLogStr;
  aFileName := vLogFile;

  aStringList := TStringList.Create;
  try
    if FileExists(aFileName) then aStringList.LoadFromFile(aFileName);
    aStringList.Add(aLogStr);
    aStringList.SaveToFile(aFileName);
  finally
    aStringList.Free;
  end;
end;
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#3

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 17:38
Daran hatte ich auch schon gedacht. Nur ist die nicht viel langsamer, oder ist das mittlerweile in Zeiten von SSDs usw ein Irrglaube?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.872 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 17:40
Dieses komische Pointer/Buffer-Gedöns ist mir unheimlich. Was gewinnt man damit?

Was spricht gegen TFile.AppendAllText(..) ?

Delphi-Quellcode:
uses System.IoUtils, System.Classes, System.SysUtils;
const
   fileName = 'x:\myFile.abc';
var
   aLogStr: String;
begin
   aLogStr := DateTimeToStr(Now) + 'derp' + sLineBreak;
   TFile.AppendAllText(fileName, aLogStr);
end.
Wenn man es unbedingt mit einem TStream machen möchte: Dann nimm doch einfach WriteData und wandel deinen Text in ein Byte-Array (TBytes) um:

Delphi-Quellcode:
   asBytes := TEncoding.ASCII.GetBytes(aLogStr);
   aFileStream.WriteData(asBytes, Length(asBytes));
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
9.303 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 17:43
Dir ist aber schon bewusst, daß string ein Unicode-String ist, in dem jedes Zeichen zwei Byte groß ist?

Im Gegensatz dazu erwartet WriteBuffer die tatsächliche Byte-Größe des zu schreibenden Buffers.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#6

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 18:21
Daran hatte ich auch schon gedacht. Nur ist die nicht viel langsamer, oder ist das mittlerweile in Zeiten von SSDs usw ein Irrglaube?
Selbst wenn (müsste ich jetzt auch testen), ist dein Log so zeitkritisch?
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#7

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 18:23
Nein natürlich nicht
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 20:23
Siehe Uwe sowie
mystring[1],length(mystring)*charsize Je nachdem wie groß die bestehende Datei ist, könnte die Stringlist etwas langsam sein.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#9

AW: TFileStream speichert nur Unsinn

  Alt 19. Jul 2016, 20:55
Ja das stimmt. Hätte ich mal die Lönge der String nachgezählt, welche abgespeichert wurden, wäre mir das bestimmt aufgefallen. Aber in dem Moment kommt man nicht drauf
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.568 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TFileStream speichert nur Unsinn

  Alt 20. Jul 2016, 08:11
Persönliche Meinung (verursacht durch Softwarefehler in allen Betriebssystemen und mit allen Programmiersprachen):
Pointer sind immer der letzte Ausweg.
Wenn man mit Pointern hantiert, sollte man vorher bereits mindestens einen halben Tag andere Lösungen versucht haben.

Es gibt nur noch ganz seltene Anwendungsfälle, die die Verwendung von Pointern notwendig machen. Dazu gehören WinAPI calls und Assembler. Wenn man also in einer VCL-Anwendung plötzlich Pointer verwenden möchte, sollte man kurz innehalten und nochmal darüber nachdenken. Pointer sind schlicht nicht zeitgemäß und zu fehleranfällig.

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf