AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi strings per filestream in datei speichern/laden
Thema durchsuchen
Ansicht
Themen-Optionen

strings per filestream in datei speichern/laden

Ein Thema von Pseudemys Nelsoni · begonnen am 11. Jan 2005 · letzter Beitrag vom 11. Jan 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 17:12
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 17:16
Moin Mario,

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

fs.Read(buf[1],...); bzw., in Deinem Falle

fs.Read(buf[0],...); da Du sonst die Adresse von Buf, und, ggf., das was dahintersteht speicherst/liest.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 17:23
hallo christian,

habs mal so geänder, bekomme aber immernoch das falsche angezeigt.
könnte nochwas falsch sein?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 17:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 18:09
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: strings per filestream in datei speichern/laden

  Alt 11. Jan 2005, 19:18
Moin!

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 von Pseudemys Nelsoni:
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 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
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:30 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