AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Filestream, string anhängen

Ein Thema von eLse-maestro · begonnen am 16. Jan 2008 · letzter Beitrag vom 18. Jan 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 15:18
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 16:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#13

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 17:21
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 17:31
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
Hanno Günther
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#15

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 17:50
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 18:06
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.
Hanno Günther
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#17

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 18:09
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...
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 18:23
Zu 2. :
Das kommt vom 1. Beitrag .
Nee, sorry, gut dass du das bemerkt hast!

EDIT: hmmm, dein Code gibt bei mir immer '' aus .
Hanno Günther
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#19

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 18:46
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;
Hanno Günther
  Mit Zitat antworten Zitat
Benutzerbild von HannosG
HannosG

Registriert seit: 2. Jul 2006
42 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 18:49
oder mit FS.Seek(-1*Count,soFromEnd);
Hanno Günther
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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