Entwickler-Ecke

Dateizugriff - String bel. Länge speichern


schlumsch - Sa 20.11.04 19:25
Titel: String bel. Länge speichern
Hallo,

ich möchte eines String beliebiger Länge per Filestream speichern.
Kann mir da wer sagen wie das geht bzw. wo ich ab besten nachschauen kann?

Thx schlumsch


Moderiert von user profile iconChristian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Sa 20.11.2004 um 18:30


wulfskin - Sa 20.11.04 19:44

Hallo,

ich hab dir mal ein paar Methoden aus meiner FileStream Klasse rauskopiert. Dann kannst du selber entscheiden welche Methode du wählen möchtest:
  1. Zunächst die Länge speichern (ich benutze dafür den Typ Word) und dann die einzelnen Zeichen.
  2. Die Zeichen speichern und mit einem #0-Zeichen beenden (PChar).
Hier die Methoden die du für beide brauchst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure TMyFileStream.WriteString(const S: Stringconst WriteSize: Boolean);
var
  Len: Word;
begin
  Len := Length(S);
  if WriteSize then
    WriteBuffer(Len, SizeOf(Len));
  if Len > 0 then
    WriteBuffer(Pointer(S)^, Len);
end;

function TMyFileStream.ReadString(const Len: Word): String;
begin
  SetLength(Result, Len);
  if Len > 0 then begin
    if Read(Pointer(Result)^, Len) <> Len then
      Result := '';
  end;
end;

function TMyFileStream.ReadString: String;
var
  Len: Word;
begin
  if Read(Len, SizeOf(Len)) <> SizeOf(Len) then
    Result := ''
  else
    Result := ReadString(Len);
end;

function TMyFileStream.ReadNTString: String;
var
  C: Char;
begin
  Result := '';
  Read(C, SizeOf(C));
  while C <> #0 do begin
    Result := Result + C;
    Read(C, SizeOf(C));
  end;
end;
Such dir raus, was du brauchst!

Viele Grüße,
Hans-Peter!


schlumsch - Sa 20.11.04 20:39

He ich dank dir


MFG


schlumsch - So 21.11.04 09:22

Also, nochmal für alle falls es interessiert ( hatte das privat abgeklärt )
Beim Laden ses Strings nicht vergessen dir Längfe zu stezen -> siehe oben Code "Setlengh".
Ansonwten gibts murks ;)


schlumsch


wulfskin - So 21.11.04 13:18

Auf persöhnlichen Wunsch nochmal eine Erläuterung zu der Funktion ReadNTString und seinem Gegenstück:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function TMyFileStream.ReadNTString: String;
var
  C: Char;
begin
  Result := '';
  Read(C, SizeOf(C));
  while C <> #0 do begin
    Result := Result + C;
    Read(C, SizeOf(C));
  end;
end;

//Gegenstück:

procedure TMyFileStream.WriteNTString(const S: String);
begin
  WriteBuffer(PChar(S)^, Length(S) + 1);
end;
Also die Lade-Funktion ReadNTString lädt Buchstabe für Buchstabe in eine Zeichenkette und bricht schliesslich das Laden ab, wenn ein #0-Zeichen ereicht ist.
Die Schreib-Prozedur schreibt die Zeichenkette plus dem abschliessenden #0-Zeichen in den Stream.

Gruß Hape!