Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Filestream, string anhängen (https://www.delphipraxis.net/106799-filestream-string-anhaengen.html)

Jens Schumann 17. Jan 2008 14:18

Re: Filestream, string anhängen
 
Hallo,
Du könntest einen der beiden TStream Nachfahren verwenden
Delphi-Quellcode:
unit Streaming;

interface

uses Sysutils, Classes;

Type

  TMemoryStreamExt = class(TMemoryStream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;

  TFileStreamExt = class(TFilestream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;



implementation


{ TFileStreamExt }

procedure TFileStreamExt.WriteStringToStream(aStr : String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;

function TFileStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;

{ TMemoryStreamExt }

function TMemoryStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;

procedure TMemoryStreamExt.WriteStringToStream(aStr: String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;


end.

Muetze1 17. Jan 2008 15:51

Re: Filestream, string anhängen
 
Zitat:

Zitat von himitsu

Nun rate mal, was SetLength() intern vorher aufruft?
Auch wäre es recht unwahrscheinlich, das ein eben mit leer initialisierter Result(-string) sich schon den leeren Platz mit einem anderen String teilt, oder?

himitsu 17. Jan 2008 16:21

Re: Filestream, string anhängen
 
macht SetLength das nicht nur bei Größenänderung?

[edit]
ok, dachte SetLength püft vorher ob sich überhaupt was an der Länge ändert,

aber *grad nachgesehn* es macht das nicht °_°



Zitat:

Auch wäre es recht unwahrscheinlich, das ein eben mit leer initialisierter Result(-string) sich schon den leeren Platz mit einem anderen String teilt, oder?
ja, aber nicht unmöglich ... wir hatten grad erst soeinen Fall hier in der DP, wo ein nicht initialisiertet String schon Daten enthielt.

> http://www.delphipraxis.net/internal...ght=initial%2A

HannosG 17. Jan 2008 16:31

Re: Filestream, string anhängen
 
Ob es nun unelegant ist oder nicht, habe ich mal alles andere an Zeigern und PChar und ...
außer acht gelassen, um nochmal direkt auf den 1. Beitrag zurückzukommen.

Delphi-Quellcode:
function GetFileStrFromEnd(FileName: String; Count: Integer): String;
var
  FS: TFileStream;
  I:integer;
begin
  FS:=tfilestream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
  try
    I:=FS.Seek(0, soFromEnd);
    FS.Seek(I-Count,soFromBeginning);
    Setlength(Result,Count);     // nicht vergessen, sonst Zugriffsverletzung
    FS.Read(Result[1],Count);    // [1] nicht vergessen, sonst Zugriffsverletzung
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( GetFileStrFromEnd('C:\background.exe', 4) );
end;
So läuft das ganze bei mir ohne Probleme.

MfG,
Hanno

himitsu 17. Jan 2008 16:50

Re: Filestream, string anhängen
 
Zitat:

Zitat von HannosG
So läuft das ganze bei mir ohne Probleme.

probier mal Count=0


muß ja nicht gleich negativ sein ... so knallt's auch schon genug :stupid:

HannosG 17. Jan 2008 17:06

Re: Filestream, string anhängen
 
Klar, ich weiß, das ist die Variante, die sich eben auf den ersten Beitrag bezieht.
Aber du musst ja auch nicht Count=0 übergeben.

Ich hab Count=0 mal ausprobiert, und auch ein paar negative Werte.
Ergebnis ist immer nicht mehr und nicht weniger als ''. (vielleicht Zufall)
Bei Count>FS.Size bekomme ich schon komische Werte heraus.

Nunja, man kann den Code dahingehend noch beliebig verbessern und ausbauen, das Grundprinzip funktioniert aber bei den richtigen Count-Angaben.

Muetze1 17. Jan 2008 17:09

Re: Filestream, string anhängen
 
1. Alle TStream Nachfahren haben eine Eigenschaft Delphi-Referenz durchsuchenTStream.Size
2. Warum seekst du auf eine Position 0 vom Ende aus gesehen um dann danach von vorne zu seeken? Warum seekst du nicht gleich auf Count Bytes vom Ende aus? So ist es völlige Resourcenverschwendung
3. Was macht dein Code, wenn die Datei kleiner ist als die mit Count angegebene Datengröße?

Also nochmal das Ganze:
Delphi-Quellcode:
function GetFileStrFromEnd(FileName: String; Count: Integer): String;
var
  FS: TFileStream;
  I:integer;
begin
  FS:=tfilestream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
  try
    if FS.Seek(Count, soFromEnd) = Count then
    begin
      Setlength(Result,Count);     // nicht vergessen, sonst Zugriffsverletzung
      FS.Read(Result[1],Count);    // [1] nicht vergessen, sonst Zugriffsverletzung
    end
    else
      result := ''; // stream ist kleiner
  finally
    fs.Free;
  end;
end;
/EDIT: zweite Seite übersehen. Also wurde der 3. Punkt schon erwähnt...

HannosG 17. Jan 2008 17:23

Re: Filestream, string anhängen
 
Zu 2. :
Das kommt vom 1. Beitrag :angel2: .
Nee, sorry, gut dass du das bemerkt hast!

EDIT: hmmm, dein Code gibt bei mir immer '' aus :( .

HannosG 17. Jan 2008 17:46

Re: Filestream, string anhängen
 
So gehts... :)

Delphi-Quellcode:
function GetFileStrFromEnd(FileName: String; Count: Integer): String;
var
  FS: TFileStream;
  I:integer;
begin
  FS:=tfilestream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
  try
    if (FS.Size>Count) and (Count>0) then
    begin
      FS.Seek(FS.Size-Count,soFromBeginning);
      Setlength(Result,Count);     // nicht vergessen, sonst Zugriffsverletzung
      FS.Read(Result[1],Count);    // [1] nicht vergessen, sonst Zugriffsverletzung
    end
    else
      begin
      result := ''; // stream<Count oder count<=0
      end;
  finally
    fs.Free;
  end;
end;

HannosG 17. Jan 2008 17:49

Re: Filestream, string anhängen
 
oder mit
Delphi-Quellcode:
FS.Seek(-1*Count,soFromEnd);


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 2 von 3     12 3      

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