![]() |
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:
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.
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; Danke im Voraus. |
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; |
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? |
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
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: String in einer Textdatei anhängen
Vielen Dank. Jetzt hab ichs begriffen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz