![]() |
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. |
Re: Filestream, string anhängen
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? |
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:
> ![]() |
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:
So läuft das ganze bei mir ohne Probleme.
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; MfG, Hanno |
Re: Filestream, string anhängen
Zitat:
muß ja nicht gleich negativ sein ... so knallt's auch schon genug :stupid: |
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. |
Re: Filestream, string anhängen
1. Alle TStream Nachfahren haben eine Eigenschaft
![]() 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:
/EDIT: zweite Seite übersehen. Also wurde der 3. Punkt schon erwähnt...
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; |
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 :( . |
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; |
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. |
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