![]() |
Streams: welche BufSize?
Hi!
Beim Arbeiten mit Streams rufe ich den Konstruktor von TWriter auf. Als Parameter erwartet er u.a. die Größe des Puffers. Welche Zahl muss ich da angeben? Kann man die berechnen? Wenn ja, wie? |
Re: Streams: welche BufSize?
Am Besten du ließt dort einfach mit ^^
![]() [add] oder mal auf den da unten hören :gruebel: (Selber nutze ich "fast" nie Streams :angel: ) |
Re: Streams: welche BufSize?
Hi,
warum genau rufst du denn den Konstruktor von Writer auf? Da sagt doch die Delphi Hilfe extra zu: Zitat:
|
Re: Streams: welche BufSize?
Zitat:
Zitat:
Zitat:
Wie schreibt man folgenden einen Code, denn ohne direkt auf den Writer zuzugreifen?
Delphi-Quellcode:
procedure Save(const AFileName: string; Figure: Integer);
var F: TFileStream W: TWriter; begin F := TFileStream.Create('MyFile.dat', fmCreate); W := TWriter.Create(F, 4000); W.WriteInteger(Figure); W.Free; F.Free; end; |
Re: Streams: welche BufSize?
Zitat:
Zitat:
In deinem Beispile hat man 'nen extra Writer verwendet, aber in TFileStream sollte doch wohl schon einer drin sein? :gruebel: Schau mal in der OH nach TFileStream ... dort müßte es Funktionen mit den Wörtern Read und Write im Namen geben :zwinker:
Delphi-Quellcode:
bei "..." kann es sein, daß dort noch irgendwas hin muß, z.B. WriteBuffer, oder so, aber da kann dir die OH besser helfen.
procedure Save(const AFileName: string; Figure: Integer);
var F: TFileStream; begin F := TFileStream.Create('MyFile.dat', fmCreate); F.Write...(Figure, SizeOf(Figure)); // oder F.Write...(Figure, 4); F.Free; end; PS: bei einem Integer (4 Byte) dürfte eine 4 auch schon reichen, oder du läßt es so, wie es ist :angel: |
Re: Streams: welche BufSize?
Zitat:
Delphi-Quellcode:
Das try...finally Gebilde ist dabei ein Schutzblock. Da du den Stream öffnest solltest du immer dafür sorgen, dass der (eben auch bei Fehlern) geschlossen wird. Alles was unter finally kommt wird immer ausgeführt (egal ob es Fehler gab oder nicht). In einen Stream ganz du jedes Datum ganz untypisiert schreiben, dabei werden wirklich die rohen Bytes geschrieben. sizeOf gibt dir die Größe eines Datums in Byte an. Das klappt zwar gut für primitive Datentypen (Zahlen, Character) und Records, aber nicht mehr für Strings und dyn. Arrays. Bei diesen musst du die Länge mit der Größe eines Elements multiplizieren (length(x) * sizeOf(x[0])), bei Strings kannst du einfach die Länge nehmen. Schreibst du ein dyn. Array in einen Stream, so musst du dort das erste Element (x[0]) übergeben, nicht nur x (x ist das dyn. Array), bei einem String gilt das Selbe, allerdings ist der Index des ersten Elements im String immer 1 statt 0.
procedure Save(const AFileName: string; Figure: Integer);
var F: TFileStream W: TWriter; begin F := TFileStream.Create('MyFile.dat', fmCreate); try F.Write(Figure, sizeOf(Figure)); finally F.Free; end; end; Gruß Der Unwissende |
Re: Streams: welche BufSize?
Erstmal danke für das, was ihr beide bisher geschrieben habt.
Zitat:
Zitat:
Wie mach ich das dann beim Lesen, wenn ich nen String hab? Dann weiß ich ja nicht von vornherein, wie viele Bytes er im Stream einnimmt. |
Re: Streams: welche BufSize?
@Der_Unwissende: Wenn man eigene Streams baut bzw. binäre Streams, dann sind die TWriter und TReader Klassen richtig gut nutzbar. Auch weil sie die Datenstruktur dynamisch optimieren und damit bekommt man gute Binärdaten hin. In der Hilfe ist dies vermerkt, damit keiner auf die Idee kommt damit direkt zu hantieren, sie sind aber schon seit sehr vielen Delphi Versionen dafür nutzbar. Schon allein durch die Typüberprüfung und auch automatischen Konvertierungen, ist es ein gutes System. Vor allem ist es bequemer als die Hexereien mit den TStream Nachfahren direkt.
|
Re: Streams: welche BufSize?
ich stimme Thomas absolut zu, meine Meinung ;)
Also nicht immer gleich vor Allem zurückzucken nur weil irgendeiner sagt tue das nicht ! Alles was in der RTL und VCL verfügbar ist kann man nutzen. Allerdings erzeugt das Stream Format der TWriter/TReader Klassen auch einen Overhead in der Größe der geschriebenen Daten. Ein direktes binäres Schreiben in den Stream ist also kompakter und die TWriter Klasse hätte nur 4 Vorteile: 1.) typsicheres Auslesen der Daten, man kann keinen String lesen wo ein Integer geswchrieben wurde 2.) der binäre Stream kann über ObjectBinaryToText() in einen Text formatierten Stream umgewandelt werden, so wie bei binären DFMs und textorientierten DFMs 3.) hierarische Datenstrukturen sind möglich, sprich gruppierte und gekapselte Datenstrukturen 4.) man kann alle Nachfahren von TPersistent in diesen Stream speichern und laden, dh. alle published Properties werden autom. erkannt und gespeichert, wie auch die Zeiger-Refrerenzen der Klassen aufgelösst (eventl. Aufruf von RegisterClasses() nötig) Also schon einige Vorteile, aber das Hauptproblem mit geänderten Datenstruktur-Aufbau bleibt bestehen wie bei binären Streams. Gruß Hagen |
Re: Streams: welche BufSize?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 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 by Thomas Breitkreuz