TFileStream und Datentypen nicht fester Länge

moin jungs,

diesmal eine nicht ganz so triviale frage:

ich hab einen typen deklariert:

type bla = record
name : string; // VARIABLE LÄNGE
zahl : Cardinal;
end;

der name hat keine fest vorgegebene länge…

wie kann ich den ganzen kram jetzt in einem TFileStream speichern und wieder auslesen??? ich kann ja nicht wissen, wie groß mein datentyp ist, sizeof geht also nicht.

um die dateigröße bei der verwendung einer typisierten datei nicht ins unermeßliche zu treiben möchte ich gerne einen filestream benutzen, so richtig hab ich aber nicht den plan, ob das mit der variablen stringlänge überhaupt machbar ist…

many thnx,

burn

Hallo,

Es gibt dafür eine ziemlich einfache Lösung. Und zwar bietet sich für solche Sachen wunderbar die Klasse TWriter an. Diese erzeugst du nach Erzeugen des TFileStream wie folgt:

Writer:=TWriter.Create(Stream: TFileStream, BufSize: longint);

Stream ist dein vorher erzeugter FileStream und BufSize ist eine Puffergröße (da die Daten nicht direkt in den Stream geschrieben, sondern gepuffert werden, ist für dein Problem jetzt aber belanglos).

TWriter stellt nun für so ziemlich alle Datentypen bequeme Schreibeprozeduren zur Verfügung. Für Strings wäre das zum Beispiel:

Writer.WriteString(s: string);

Schau am besten mal in der Hilfe nach, da steht das alles ausführlich.

!! Und nicht vergessen:
Writer.Free
…bevor du den Stream löschst.

Also viel Spaß beim Ausprobieren.

Gruß Christian

Funktioniert sicher irgendwie.
Variante 1: Du gibst in der Datei die Länge des jeweiligen Strings an
Variante 2: Du verwendest spezielle Trennzeichen für die Strings (z.B. Zeilenumbrüche mit Writeln)
Variante 3: Du gehst einen kleinen Umweg über Stringlisten (SavetoFile bzw. Text)

Gruß, Steffen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

na
da warst Du wohl bisschen schneller als ich. TWriter hab ich bisher noch nicht genommen; klingt aber gut.

Gruß, Steffen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

danke jungs, mit treader und twriter funzt es perfekt!

aber diesbezüglich nochmal eine kleine frage:

ich hab dazu online auch noch ein paar seiten gefunden und auf einer steht folgendes :

Reader := TReader.Create (FileStream, $ff);

was bedeutet das $ff? normalerweise sollte ja eigentlich ein integerwert dort stehen, also geh ich davon aus, dass das eine art umgebungsvariable ist oder täusche ich mich?

thnx,

burn

Reader := TReader.Create (FileStream, $ff);

was bedeutet das $ff? normalerweise sollte ja eigentlich ein
integerwert dort stehen, also geh ich davon aus, dass das eine
art umgebungsvariable ist oder täusche ich mich?

Hi Burn,

„$ff“ hat mit Umgebungsvariablen nichts zu tun, sondern ist ein INTEGER-Wert. Er ist bloß nicht in Dezimal-, sondern in Hexadezimalnotation aufgeschrieben. Jeder Pascal-Compiler „versteht“ die „Hexnotation“ von Haus aus. Du mußt nur dem entsprechenden Zahlensymbol ein „$“ voranstellen (ohne Leerzeichen-Firlefanz oder dergleichen), damit der Compiler Bescheid weiß (denn „348“ ist ja was anderes als „$348“). Das „$“ entspricht also dem „0x“ in C/C++.

Wenn Du in einem Quelltext Hexzahlen wie „$FF“ oder „$FFFF“ oder „$1000“ vorfindest, kannst Du das übrigens immer als Hinweis darauf werten, daß der Autor sein Handwerk versteht. Wer „65535“ schreibt, zeigt, daß er sich noch im Anfängerstadium befindet.

$A ist gleich 10 dezimal, $B gleich 11 dezimal usw. bis $F gleich 15 dezimal. Bei 16 dezimal gibt’s den Überlauf auf die nächsthöhere Stelle: 16 dezimal = $10. Was „$FF“ in dezimal ist, kannst Du Dir nun selbst ausrechnen.

Gruß
Martin