AGB  ·  Datenschutz  ·  Impressum  







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

String mit FileStream speichern

Ein Thema von Viktorii · begonnen am 26. Mär 2009 · letzter Beitrag vom 26. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

String mit FileStream speichern

  Alt 26. Mär 2009, 07:09
Hallo zusammen.

Ich möchte einfach einen String mit einem FileStream speichern.
So hab ich es gemacht:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FFileStream : TFileStream;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyString : String;
  LengthOfString : Integer;

begin
  MyString := 'Hallo Welt' + #13#10;
  LengthOfString := Length(MyString);

  FFileStream.Write(MyString, LengthOfString);
end;

//------------------------------------------------------------------------------

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(FFileStream);
end;

//------------------------------------------------------------------------------

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFileStream := TFileStream.Create('MyStream.txt', fmCreate, (fmShareDenyRead or fmShareDenyNone));
end;

//------------------------------------------------------------------------------

end.
Leider steh in meiner Text Datei nicht das gewünschte Ergebnis sonder diese Hex Wert:

C4 42 46 00 20 43 A1 00 04 F7 12 00

Was mache ich falsch?

Vielen Dank
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 09:03
Glaube das müsste gehen:
Delphi-Quellcode:
FFileStream.Write(MyString[1], LengthOfString);
//oder gleich
FFileStream.Write(MyString[1], Length(MyString));
Strings sind nur Pointer auf eine Referenz-Struktur (oder so ähnlich)...
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#3

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 09:18
Du musst auf jeden Fall auch beachten, dass diese Lösung nur mit genau EINEM String funktioniert, da du sonst beim Zurücklesen des Filestreams nicht mehr weisst wie lang der String ist.

Normalerweise schreibst du als erstes die Länge des Strings in den Stream, danach den String selbst. Beim Lesen kannst du dann zuerst die Länge auslesen und anschließend die richtige Anzahl an Bytes für den String. Das funktioniert auch bei mehreren Strings (oder anderen Datenstrukturen mit nicht konstanter Länge).

Beispiel.

String1 = 'Hallo'
String2 = 'Welt'

Im korrekt gespeicherten Stream sollte jetzt stehen:

05 H a l l o 04 W e l t

Einlesen:

Zuerst die Länge = 5 dann fünf Zeichen - der Zeiger des Stream steht jetzt genau auf der Längeninformation des nächsten String = 4 dann vier Zeichen.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 10:41
Zitat von guidok:
da du sonst beim Zurücklesen des Filestreams nicht mehr weisst wie lang der String ist.
Wenn er wie beim Testwert überall ein #13#10 dahinter setzt, kann er zum Lesen auch eine TStringList nehmen (zum schreiben eigentlich auch)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 12:28
Zitat von Viktorii:
Delphi-Quellcode:
var
  MyString : String;
  LengthOfString : Integer;

begin
  MyString := 'Hallo Welt' + #13#10;
  LengthOfString := Length(MyString);
  FFileStream.Write(MyString, LengthOfString);
Leider steh in meiner Text Datei nicht das gewünschte Ergebnis sonder diese Hex Wert:

C4 42 46 00 20 43 A1 00 04 F7 12 00
C4 42 46 00 = $004642C4 = die Adresse, wo der String im RAM zu finden ist ... eine String-Variable ist intern nur ein Pointer, welcher auf den "Text" zeigt (nja, er zeigt auf einen bestimmten Punkt innerhalb der String-Daten incl. Referenzzählung, Längenangabe und Co., wo aber "zufällig" auch der Text beginnt)

drumm mußt du den Zeiger erstmal sozusagen dereferenzieren ... also z.B. via MyString[1]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#6

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 13:40
Zitat von Satty67:
Zitat von guidok:
da du sonst beim Zurücklesen des Filestreams nicht mehr weisst wie lang der String ist.
Wenn er wie beim Testwert überall ein #13#10 dahinter setzt, kann er zum Lesen auch eine TStringList nehmen (zum schreiben eigentlich auch)
Können würde er vieles... er wollte ja explizit einen Stream haben.

Aber natürlich hast du recht. Er könnte den Stream byteweise einlesen, bis ein Endezeichen erkannt wird. Ob dass allerdings performant ist? Zudem ist die Lösung, die Blocklänge (Stringlänge) voran zu stellen insofern wichtig, da damit in einem Stream alle möglichen Formate (Strings, Zahlenwerte, Bitmaps, Sounddaten, usw) auf diese Art gespeichert werden können. Man muss nur in der selben Reihenfolge wie beim Speichern einlesen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 13:46
Zitat:
Zudem ist die Lösung, die Blocklänge (Stringlänge) voran zu stellen insofern wichtig, da damit in einem Stream alle möglichen Formate (Strings, Zahlenwerte, Bitmaps, Sounddaten, usw) auf diese Art gespeichert werden können.
wenn man in der selben Reinfolge ausließt, dann geht es auch so ... hier ist statt der Länge eine abschließende #0 als Längenmarkierung vorhanden
Delphi-Quellcode:
MyString := 'Hallo Welt'; // geht so nur wenn MyString <> '' ist

FFileStream.Write(MyString[1], Length(MyString) + 1);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 14:03
Zitat von himitsu:
wenn man in der selben Reinfolge ausließt, dann geht es auch so ... hier ist statt der Länge eine abschließende #0 als Längenmarkierung vorhanden
Zitat:
Er könnte den Stream byteweise einlesen, bis ein Endezeichen erkannt wird. Ob dass allerdings performant ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 14:27
Zitat von guidok:
Er könnte den Stream byteweise einlesen, bis ein Endezeichen erkannt wird. Ob dass allerdings performant ist?
kommt drauf an, wie man sucht

Blockweise (in geeigneten Blockgrößen) einlesen, darin suchen und wenn gefunden, dann zurückspringen
oder gleich einen Lesepuffer einrichten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: String mit FileStream speichern

  Alt 26. Mär 2009, 15:26
Zitat von himitsu:
... hier ist statt der Länge eine abschließende #0 als Längenmarkierung vorhanden
Dann aber bitte so:
Delphi-Quellcode:
MyString := 'Hallo Welt'; // geht so nur wenn MyString <> '' ist

FFileStream.Write(MyString[1], Length(MyString) + 1);
Sonst tritt wieder das weiter oben beschriebene Problem auf.

Ich würde auch einen Blick auf TStringStream empfehlen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:52 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