Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String in einer Textdatei anhängen (https://www.delphipraxis.net/98671-string-einer-textdatei-anhaengen.html)

Moony 30. Aug 2007 17:43


String in einer Textdatei anhängen
 
Hallo zusammen,

ich hab da ein Problem mit dem Verschlucken von Bytes und weiß einfach nicht weiter. Ich möchte jedes Mal bei einer bestimmten Aktion Daten in eine Datei schreiben. Der Hintergrund ist, ich habe eine bestimmte Länge eines Strings, welcher jedes Mal variabel ist. Dieser String wird verkryptet, sodass ich als Rückgabewert einen String mit Mülldaten habe. Die Länge des neuen Strings ist immer gleich; in meinem Fall immer 400 Bytes. Diese 400 Bytes möchte ich jedesmal in eine Textdatei schreiben, indem ich immer die 400 Bytes in die Datei anhänge. Dies geschieht folgendermaßen:

Delphi-Quellcode:
var
  linesize : Integer;
  line    : String;
  LogFile : TextFile;
begin
...
AssignFile(LogFile, "meine Datei");
try
  if FileExists("meine Datei") then
    Append(LogFile)
  else Rewerite(LogFile);

  linesize := 0;
  linesize := length(line);
  Writeln(Logfile, EncText(line,linesize)); // EncText ist eine Funktion zum verkrypten des Strings
finally
  CloseFile(LogFile);
end;
...
end;
Mein Problem besteht darin, dass unkoordiniert nach ein paar Mal schreiben die Bytes fehlen. Normalerwesise müssten es immer plus 402 Bytes sein (meine 400 plus 2 Bytes der CarriageReturn vom Writeln), aber der verschluckt die Bytes sporadisch. Kann mir bitte jemand sagen warum??? Ich drehe hier noch durch :wall: ...Der Rückgabewert meiner EncText-Routine hat definitiv die Länge 400.

Danke im Voraus.

shmia 30. Aug 2007 17:48

Re: String in einer Textdatei anhängen
 
Versuchs mal damit.
So können auch binäre Daten (wie z.B. #$00) die bei Verschlüsseln entstanden sind
gespeichert werden.
Delphi-Quellcode:
procedure AppendStringToFile(const s:String; const filename:string);
var
   stream : TStream;
const
   SO_END=2;
begin
   if s = '' then
      Exit;
   if FileExists(filename) then
   begin
      stream := TFileStream.Create(filename, fmOpenReadWrite or fmShareDenyWrite);
      stream.Seek(0, SO_END);
   end
   else
      stream := TFileStream.Create(filename, fmCreate or fmShareDenyWrite);
   try
      stream.Writebuffer(s[1], Length(s));
   finally
      stream.Free;
   end;
end;

Moony 30. Aug 2007 17:58

Re: String in einer Textdatei anhängen
 
Supper, das funktionert wunderbar. Nur der Carriagereturn ist nicht da, aber das ist nicht schlimm.

Ich möchte es irgendwie trotzdem verstehen können, warum die Bytes verschluckt werden, obwohl immer die gleiche Anzahl an Daten übergeben werden.

Was ist dann der Unterschied ob ich direkt in eine Datei schreibe, oder erst über den Speicher in die Datei schreibe?

shmia 30. Aug 2007 18:13

Re: String in einer Textdatei anhängen
 
Deine Variante vewendet die uralte Funktion WriteLn.
Die Funktion stammt noch aus Pascal Gründungszeiten und hat eine Text- und eine binäre Betriebsart.
Es gibt da noch eine gepufferte Zwischenschicht (in Assembler geschrieben),
die zu den Zeiten ihre Berechtigung hatte, als Windows oder MS-DOS noch keinen Plattencache hatten.
Heute ist diese Pufferschicht eher störend.
TFileStream ist viel näher am Betriebssystem und gibt die Daten 1:1 weiter.
Wenn du den CR-LF auch speichern möchtest dann:
Delphi-Quellcode:
AppendStringToFile(EncText(line,linesize)+#13#10,'meine Datei')

DP-Maintenance 30. Aug 2007 22:53

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.

Moony 31. Aug 2007 07:47

Re: String in einer Textdatei anhängen
 
Vielen Dank. Jetzt hab ichs begriffen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz