Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi strings per filestream in datei speichern/laden (https://www.delphipraxis.net/37873-strings-per-filestream-datei-speichern-laden.html)

Pseudemys Nelsoni 11. Jan 2005 16:12


strings per filestream in datei speichern/laden
 
hi,

was ist an folgendem falsch?

Delphi-Quellcode:
procedure TServerBanList.Load(const FileName: string);
var
  FS: TFileStream;
  Buf: array[0..14+1] of Char;
begin
  FS := TFileStream.Create(FileName, fmOpenRead   or fmShareExclusive);
  try
    while FS.Read(Buf, Length(Buf)) = Length(Buf) do
      if not IsBanned(Buf) then
        Ban(Buf);
  finally
    FS.Free;
  end;
end;

...

procedure TServerBanList.Save(const FileName: string);
var
  FS: TFileStream;
  ServerBan: PServerBan;
begin
  FS := TFileStream.Create(FileName, fmCreate   or fmShareExclusive);
  try
    ServerBan := FServerFirstBan;
    while ServerBan <> nil do
    begin
      FS.Write(ServerBan^.IP, Length(ServerBan^.IP)+1);
      ServerBan := ServerBan^.Next;
    end;
  finally
    FS.Free;
  end;
end;


beim laden (ich speichere hier ips, das heisst ich brauche maximal 16byte pro ip) bekomme ich komische zeichen zurückgegeben, aber sicher nicht meine ips, ist dort irgendwo was verkehrt? (doofe frage - muss ja). ich möchte die ips einer verketteten liste speichern/laden können.... ich könnte auch ne stringliste verwenden, aber das möchte ich nicht

mfg

Christian Seehase 11. Jan 2005 16:16

Re: strings per filestream in datei speichern/laden
 
Moin Mario,

wenn Du Strings speichern willst, musst Du den Index des ersten Zeichens angeben:

Delphi-Quellcode:
fs.Read(buf[1],...);
bzw., in Deinem Falle

Delphi-Quellcode:
fs.Read(buf[0],...);
da Du sonst die Adresse von Buf, und, ggf., das was dahintersteht speicherst/liest.

Pseudemys Nelsoni 11. Jan 2005 16:23

Re: strings per filestream in datei speichern/laden
 
hallo christian,

habs mal so geänder, bekomme aber immernoch das falsche angezeigt.
könnte nochwas falsch sein?

Muetze1 11. Jan 2005 16:46

Re: strings per filestream in datei speichern/laden
 
Moin!

Gleiches gilt natürlich auch für's speichern (IP).

Dann noch eine Frage: warum speicherst du das als String? Warum nicht einfach 4x 1 Byte? Vor allem hast du bei 4x1 Byte nicht das Problem zu überlegen ob es nun weniger als 16 Byte sind oder nicht - vor allem - wie kommst du auf 16 Byte?

MfG
Muetze1

Pseudemys Nelsoni 11. Jan 2005 17:09

Re: strings per filestream in datei speichern/laden
 
hallo mütze,

ich hab das beim spoeichern nun so:

Delphi-Quellcode:
procedure TServerBanList.Save(const FileName: string);
var
  FS: TFileStream;
  ServerBan: PServerBan;
begin
  FS := TFileStream.Create(FileName, fmCreate   or fmShareExclusive);
  try
    ServerBan := FServerFirstBan;
    while ServerBan <> nil do
    begin
      FS.Write(ServerBan^.IP[1], Length(ServerBan^.IP));
      ServerBan := ServerBan^.Next;
    end;
  finally
    FS.Free;
  end;
end;
nun bekomm ich aber immernoch nichts angezeigt wenn ich es wieder lade :(

Zitat:

Dann noch eine Frage: warum speicherst du das als String? Warum nicht einfach 4x 1 Byte? Vor allem hast du bei 4x1 Byte nicht das Problem zu überlegen ob es nun weniger als 16 Byte sind oder nicht - vor allem - wie kommst du auf 16 Byte?
wenn ich es nicht als string speicher sondern in 4 byte aufteile, muss ich das ganze ja noch parsen, macht das das ganze nicht langsamer?
ich meine 16 byte, weil die ip selbst bis zu 15byte sein kann (z.b 255.255.255.255 = 15 zeichen) +1 byte für die laengenangabe des strings

Muetze1 11. Jan 2005 18:18

Re: strings per filestream in datei speichern/laden
 
Moin!

Zitat:

Zitat von Pseudemys Nelsoni
hallo mütze,

ich hab das beim spoeichern nun so:

Delphi-Quellcode:
procedure TServerBanList.Save(const FileName: string);
begin
  ... sieht so ok aus wie dargestellt ...
end;
nun bekomm ich aber immernoch nichts angezeigt wenn ich es wieder lade :(

Hast du das Laden auch abgeändert? Also Stringlänge vorher gesetzt und beim Laden [1] angegeben? Woher weisst du wieviele Zeichen du laden musst? Schon alleine eine IP Folge von 123.123.123.3 23.123.123.123 kann beim lesen einmal wie ebend geschrieben ausgelesen werden, genauso aber auch als 123.123.123.32 und 3.123.123.123 und daher ist die Frage der Länge wichtig. Daneben ist das mit 4x 1 Byte sicher.

Zitat:

Zitat von Pseudemys Nelsoni
Zitat:

Zitat von Muetze1
Dann noch eine Frage: warum speicherst du das als String? Warum nicht einfach 4x 1 Byte? Vor allem hast du bei 4x1 Byte nicht das Problem zu überlegen ob es nun weniger als 16 Byte sind oder nicht - vor allem - wie kommst du auf 16 Byte?

wenn ich es nicht als string speicher sondern in 4 byte aufteile, muss ich das ganze ja noch parsen, macht das das ganze nicht langsamer?

Warum verwaltest du es als String? Ein TCustomWinSocket hält die IP Adressen auch ordentlich wie bei den Socket bereit als 4 einzelne Bytes (Addr und RemoteAddr, Type TSocketAddrIn) und diese Klasse nutzen TServerSocket und TClientSocket. Daher ist es eine Frage der Verarbeitung - wenn du dir einen String nimmst und mit dem arbeitest, dann hast du dies Problem, ja. Wenn du dir die "richtigen" "rohen" unverarbeiteten Daten holst, dann hast du kein Problem, vor allem ist es einfach aus 4x 1 Byte eine IP Adresse in der Form von aaa.bbb.ccc.ddd zu bekommen mit IntToStr() (User readable).

Zitat:

Zitat von Pseudemys Nelsoni
ich meine 16 byte, weil die ip selbst bis zu 15byte sein kann (z.b 255.255.255.255 = 15 zeichen) +1 byte für die laengenangabe des strings

Ok, mit dem Längenbyte sollten sich die Bedenken die ich zuvor noch geäussert hatte erledigt haben...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 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