Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit TFileStream/ReadBuffer (https://www.delphipraxis.net/11414-problem-mit-tfilestream-readbuffer.html)

X-Dragon 6. Nov 2003 09:40


Problem mit TFileStream/ReadBuffer
 
Hat irgendjemand eine Idee warum in meinem Programm gerade beim 16. Eintrag eine falsche Größe ausgelesen wird (belegt dann ca 1 GB Speicher!)? Soweit ich es beobachten konnte werden die Daten richtig verschlüsselt und auch gespeichert, aber beim auslesen tritt immer an der selben Stelle der Fehler auf (an dieser Stelle ist der Wert "67" gespeichert).

Speichern einer StringListe als TFileStream:
Delphi-Quellcode:
  if FileExists(datM) then
    E_Stream := TFileStream.Create(datM, fmOpenWrite or fmShareDenyNone)
    else E_Stream := TFileStream.Create(datM, fmCreate);

  for i := 0 to 22 do
  begin
    txt := XORString(Schluessel[S_Nr(i)],bodytxt[i]); // verschlüsseln von StringList-Einträgen
    Count := Length(txt);
    E_Stream.WriteBuffer(Count, SizeOf(Integer));
    if Count > 0 then
      E_Stream.WriteBuffer(txt[1], Count);
  end;
Auslesen eines TFileStreams in eine StringListe:
Delphi-Quellcode:
  List := TStringList.Create;
  FStream := TFileStream.Create(datM, fmOpenRead);

  for i := 0 to 22 do
  begin
    FStream.ReadBuffer(Count, SizeOf(Count));
    SetLength(txt, Count); // beim 16 Durchlauf, also i = 15 hat Count einen Wert von über 1 Mio.
                            // und in txt steht ein anderer Wert als eigentlich gepspeichert inkl sehr sehr vielen Nullen
                            // die vorherigen Einträge werden alle korrekt ausgelesen

    if Count > 0 then
      if Count < 1000 then
        FStream.ReadBuffer(txt[1], Count)
        else ShowMessage('Daten sind fehlerhaft!'); // hab ich jetzt erstmal als Sicherung eingebaut
                                                     // damit er mir nicht mehr den Speicher vollmüllt

    List.Add(XORString(Schluessel[S_Nr(i)],txt)); // enschlüsseln der ausgelesenen Daten
  end;

scp 6. Nov 2003 15:50

Re: Problem mit TFileStream/ReadBuffer
 
Also, erstmal würde ich statt Integer eher LongWord verwenden, da die Länge eines String ja nie negativ ist.
Dann brauche ich mehr Infos. Z.B. hast du bei der Lese- und bei der Schreibmethode die Variable Count gleichermassen als integer deklariert? Gibt es bei den Strings, die gespeichert werden, welche die eine Länge von 0, also keinen Inhalt haben? WEnn die Datei DatM existiert, willst du sie dann überschreiben oder die Daten anhängen?

X-Dragon 6. Nov 2003 18:01

Re: Problem mit TFileStream/ReadBuffer
 
Zitat:

Zitat von scp
Also, erstmal würde ich statt Integer eher LongWord verwenden, da die Länge eines String ja nie negativ ist.
Dann brauche ich mehr Infos. Z.B. hast du bei der Lese- und bei der Schreibmethode die Variable Count gleichermassen als integer deklariert? Gibt es bei den Strings, die gespeichert werden, welche die eine Länge von 0, also keinen Inhalt haben? WEnn die Datei DatM existiert, willst du sie dann überschreiben oder die Daten anhängen?

Werde den Code oben wahrscheinlich nicht mehr gebrauchen, da ich es jetzt ganz anders und mit weniger Aufwand lösen werde. Aber interessieren tut es mich doch was da schief gelaufen ist.

Also Count ist bei beiden als Integer deklariert (ist irgendwie Gewohnheit :), aber hast natürlich recht), und bei den Strings gibt es auch "Leerstrings" wo ich dann also nur die Länge 0 speicher. Die Datei an sich soll überschrieben werden falls vorhanden.

Aber den Vorgang hab ich mit sowie auch ohne Leerstrings getestet, also das funktioniert an sich eigentlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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