Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Typisierte datei anlegen (https://www.delphipraxis.net/84944-typisierte-datei-anlegen.html)

schuetzejanett 23. Jan 2007 23:29


Typisierte datei anlegen
 
hallo,

wie lege ich eine typisierte datei an?

Ich möchte eine typisierte datei für folgenden record anlegen

Delphi-Quellcode:
TField = record
     x1,y1,x2,y2,x3,y3,x4,y4 : Integer;
     Name :String[4];
end;
ich möchte die Werte aber in Delphi nur auslesen. da ich die Werte ja kenne , möchte ich sie gerne über einen texteditor eingeben. Weiß allerdings nicht wie, ich diese Datei mit einem editor oder ähnlichem Anlege und die Werte eingebe was muss da als Trennung zwischen den einzelnen Variablen und TFields stehen.

Luckie 23. Jan 2007 23:34

Re: Typisierte datei anlegen
 
Also eine typisierte Dtei mit einem Editor zu editieren, könnte sehr schwer werden. Warum nimmst du keine Ini-Datei? Die wäre wesentlich besser dazu geeigent.

Christian Seehase 23. Jan 2007 23:38

Re: Typisierte datei anlegen
 
Moin Janett,

so wie der Record aufgebaut ist, stehen die integer-Werte als jeweils 4 Byte hintereinander, wobei das niedewertigste Byte jeweils das äusserst Linke ist, dann folgt das Längenbyte des Strings (also eine 4) und dann die vier Zeichen des Strings.
Aber wie willst Du über einen Editor die Integer eingeben?
Zumindest wenn in den Bytes der Integer Werte < 32 stehen sollen/können, wirst Du sie über einen Texteditor nicht mehr eingeben können.

Ausserdem solltest Du den Record besser als packed record deklarieren, um nicht eventuell Lücken im Record zu haben.

Hador 24. Jan 2007 01:05

Re: Typisierte datei anlegen
 
Zitat:

Zitat von Christian Seehase
Aber wie willst Du über einen Editor die Integer eingeben?

:gruebel: Wiso? Mit einem Hex-Editor sollte das eigentlich doch kein Problem sein.

Ein guter ist bspw. HxD

Chemiker 24. Jan 2007 01:48

Re: Typisierte datei anlegen
 
Hallo,

die einzelnen Zahl und der String müsste man im Text-Editor durch Sepparatoren trennen, und sie anschließend im Programm im Einzelnen wieder herauslösen.

z.B.: [10|1|100|22|50|3|88|11|test]

m.wollert 24. Jan 2007 02:41

Re: Typisierte datei anlegen
 
Hallo,

also wenn Du die Auslese-Routine bereits hast, ist es sicher schneller die kurz umzustricken, daß die Datei wie gewünscht angelegt wird, als mit dem Editor etwas zu versuchen.

Grüße!
Michael

Hador 24. Jan 2007 14:31

Re: Typisierte datei anlegen
 
Zitat:

Zitat von Chemiker
Hallo,

die einzelnen Zahl und der String müsste man im Text-Editor durch Sepparatoren trennen, und sie anschließend im Programm im Einzelnen wieder herauslösen.

z.B.: [10|1|100|22|50|3|88|11|test]

:gruebel: Er will das doch mit einer typisierten Datei machen. Da braucht man keine Seperatoren. Jeder Integer bekommt ohnehin 4 Byte. Und die Länge des Strings ist ja auch konstant.

DP-Maintenance 24. Jan 2007 19:44

DP-Maintenance
 
Dieses Thema wurde von "r_kerber" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Hat ja irgendwie mit Delphi zu tun.

Chemiker 24. Jan 2007 21:21

Re: Typisierte datei anlegen
 
Hallo,

Zitat:

Zitat von Hador
Er will das doch mit einer typisierten Datei machen. Da braucht man keine Seperatoren. Jeder Integer bekommt ohnehin 4 Byte. Und die Länge des Strings ist ja auch konstant

Das Auslesen der Werte will schuetzejanett über eine typisierten Datei durchführen, aber die Eingabe soll über einen Texteditor erfolgen.

Und in einem Texteditor werden die Zahlen als Zeichen abgespeichert.


Zitat:

Zitat von Christian Seehase
Ausserdem solltest Du den Record besser als packed record deklarieren, um nicht eventuell Lücken im Record zu haben.

Das stimmt, aber durch die Verwendung von packed wird der Zugriff auf die Daten verlangsamt.
Bei ungepackten Records werden die Felder so erweitert, dass die CPU möglichst effizient darauf zugreifen kann.

Bis bald Chemiker

schuetzejanett 24. Jan 2007 21:30

Re: Typisierte datei anlegen
 
Hallo,

da das doch ziemlich kompliziert zu sein scheint habe ich mir jetzt ein kleines Tool geschrieben was die daten in die indizierte Dati schreibt , und lese sie dann in der anderen einfach wieder aus.

danke trotzdem für eure Hilfe

efknarf 24. Jan 2007 21:50

Re: Typisierte datei anlegen
 
Huhu,

vielleicht hilft dir das weiter...

Delphi-Quellcode:
type
 TField = record
      x1,y1,x2,y2,x3,y3,x4,y4 : Integer;
      Name :String[4];
 end;

 TFieldFile = File of TField;

procedure DatenSchreiben(const FileName: TFileName);
var F: TFieldFile;
    Buff: TField;
begin
 AssignFile(F,FileName);
 Rewrite(F); //RecSize darf bei einer typisierten Datei nicht angegeben werden
 try
  while NochDatenVorhanden do begin //weitere Daten vorhanden? True! Weiter gehts!!
   Buff.X1:=HoleX1; //functionen, um Integerwerte zu holen
   Buff.X2:=HoleX2;
   Buff.X3:=HoleX3;
   //... usw. bis alle Daten initialisiert wurden
   write(F,Buff);
  end;
 finally
  CloseFile(F);
 end;
end;

procedure DatenLesen(const FileName: TFileName);
var F: TFieldFile;
    Buff: TField;
begin
 AssignFile(F,FileName);
 if FileExists(FileName) then begin //Testen, ob Datei vorhanden ist
  Reset(F);
  try
   while not EOF(F) do begin //Einlesen, bis Dateiende
    Read(F,Buff);
    TueDiesOderDas(Buff); //eingelesene Daten verarbeiten
   end;
  finally
   CloseFile(F);
  end;
end;
Gruß Frank

Christian Seehase 24. Jan 2007 22:00

Re: Typisierte datei anlegen
 
Moin Chemiker,

Zitat:

Zitat von Chemiker
Das stimmt, aber durch die Verwendung von packed wird der Zugriff auf die Daten verlangsamt.

Aber nur, falls das packed tatsächlich zu einer Änderung der Verteilung führt, allerdings ist es recht gefährlich das packed bei Records wegzulassen, die als Datensatz für eine Datei verwendet werden sollen, da man ansonsten ja auch den Inhalt der Lücken mit abspeichert.
Sollte man nicht daran denken, und das Alignment geändert haben, kann man die Daten u.U. dann auch kaum noch lesen. ;-)


Zitat:

Zitat von Chemiker
Das Auslesen der Werte will schuetzejanett über eine typisierten Datei durchführen, aber die Eingabe soll über einen Texteditor erfolgen.

Und in einem Texteditor werden die Zahlen als Zeichen abgespeichert.

Deshalb schrieb ich ja, dass man Werte < 32 kaum mit einem Texteditor wird eingeben können, ausser vielleicht, man bekommt das mit Unicode hingetrickst. Somit wäre, bei dem gegebenen Satzaufbau, schon die Stringlänge nicht eingebbar.

Mavarik 25. Jan 2007 09:14

Re: Typisierte datei anlegen
 
Zitat:

Zitat von Christian Seehase

Aber nur, falls das packed tatsächlich zu einer Änderung der Verteilung führt, allerdings ist es recht gefährlich das packed bei Records wegzulassen, die als Datensatz für eine Datei verwendet werden sollen, da man ansonsten ja auch den Inhalt der Lücken mit abspeichert.
Sollte man nicht daran denken, und das Alignment geändert haben, kann man die Daten u.U. dann auch kaum noch lesen. ;-)

Eben, daher einfach {$A1} angeben und weiterarbeiten...

Frank :coder:

Chemiker 25. Jan 2007 09:42

Re: Typisierte datei anlegen
 
Hallo,

Zitat:

Zitat von Mavarik
Eben, daher einfach {$A1} angeben und weiterarbeiten...

Die Angabe {$A1} ist fehlerhaft.

Richtig:

{$A-} ungepackten Record
{$A+} gepackten Record

Ich wollte aber keine Grundsatzdiskussion über packed oder unpacked in einem Record lostreten, sondern nur darauf hinweisen.

Bis bald Chemiker


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