Autor Beitrag
Bull80
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

mal dies, mal das

BeitragVerfasst: So 08.10.06 15:38 
hi @ all,

folgendes problem. möchte in eine bereits vorhandene streamdatei weitere daten hinzufügen, welche auch nach dem beenden des programs wieder gelöscht werden. der vorhandene inhalt der stream datei sieht wie folgt aus:

42.90 110.50 -217.66 190.58 0.98 83.40
35.75 102.80 -241.46 212.15 1.17 70.37
28.60 95.10 -265.26 233.72 1.39 48.76
21.45 62.69 -194.81 195.68 1.55 44.33
14.30 30.27 -124.35 157.63 2.05 29.92

nun soll z.b. ein weiterer datensatz drangehängt werden, als beispiel:

14.13 28.15 25.66 15.22 12.11 5.66

ich komme wirklich nicht weiter und überall steht was völlig anderes über streamdateien. bitte dringend um hilfe, vielen dank...


ausblenden 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:
procedure TForm1.NeueKurveClick(Sender: TObject);
var
     Buffer: array[0..BufferSize - 1] of Polsterkurven;
     i, p: integer;
begin
     Seek(datei,0);
     p:=0;
  while not eof(datei) do begin //solange lesen, bis die Datei zu Ende ist
     Read(datei, Buffer[p]);
     inc(p);
  if p > 9 then      //entspr. p:=p+1
  exit;
  end;
     CloseFile(datei); //Datei schließen...
     Buffer[p+1].HZUD:= 0; //Am Ende leeren Datensatz anhängen
     Buffer[p+1].a0:= 0;
     Buffer[p+1].a1:= 0;
     Buffer[p+1].a2:= 0;
     Buffer[p+1].xmin:= 0;
     Buffer[p+1].ymin:= 0;

     ReWrite(datei);  //... und neu anlegen
  for i:=0 to p do write(datei, Buffer[i]);
     //Datensätze (bis auf letzten) in Datei schreiben
     positionieren(FileSize(datei)-1);
     //Dateizeiger auf letzten Datensatz positionieren
end;



gruß
björn

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: So 08.10.06 17:43 
Wie ist TPolsterkurven deklariert?

Und wo ist jetzt konkret dein Problem? Weil wo willst du in dem Code neue Daten einfügen? Bisher hängst du nur Nullen dran. Und warum darf p nicht 10 werden?

_________________
Programmers never die, they just GOSUB without RETURN
Bull80 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

mal dies, mal das

BeitragVerfasst: So 08.10.06 18:00 
dank dir schon jetzt für deine antwort.

polsterkurven = record

p darf nicht 10 werden, weil wir insgesamt nur 9 datensätze einbinden sollen. meine damit also insgesamt 9 zeilen soll die streamdatei enthalten. ich weiss absolut nicht, wie ich an die bereits vorhandenen datensätze in der streamdatei neue am ende dran setze bis ich halt insgesamt 9 zeilen erreicht habe.

eine grafik über den aufbau unseres projektes findest hier : www.bosserver.de/delphi3.gif ganz unten bezieht sich der streamteil drauf!

ausblenden volle Höhe 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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Menus, ExtCtrls;

  const
  Buffersize =10;
type
  Polsterkurven = record
    hzud, a0, a1, a2, Xmin, Ymin : single;
  end;
  TForm1 = class(TForm)
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    Pagecontrol: TPageControl;
    Maske1: TButton;
    Maske2: TButton;
    Maske3: TButton;
    Grafik: TButton;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Laden1: TMenuItem;
    Speichern1: TMenuItem;
    N1: TMenuItem;
    E_HzuD: TEdit;
    E_A1: TEdit;
    E_A0: TEdit;
    E_A2: TEdit;
    E_Xmin: TEdit;
    E_Ymin: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Erstekurve: TButton;
    VorigeKurve: TButton;
    NaechsteKurve: TButton;
    LetzteKurve: TButton;
    KurveSpeichern: TButton;
    KurveLoeschen: TButton;
    NeueKurve: TButton;
    E_Laenge: TEdit;
    E_Masse: TEdit;
    E_Fallhoehe: TEdit;
    E_GWert: TEdit;
    E_Breite: TEdit;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Berechnen: TButton;
    Image1: TImage;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    E_Polsterd: TEdit;
    E_Polsterf: TEdit;
    E_Stat: TEdit;
    Zuruecksetzen: TButton;
    StatusBar1: TStatusBar;
    Label1: TLabel;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    procedure OnMaske1click(Sender: TObject);
    procedure OnMaske2click(Sender: TObject);
    procedure OnMaske3click(Sender: TObject);
    procedure Onformshow(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure oneditkeypress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure positionieren(datensatz: integer);
    procedure ErstekurveClick(Sender: TObject);
    procedure VorigeKurveClick(Sender: TObject);
    procedure NaechsteKurveClick(Sender: TObject);
    procedure LetzteKurveClick(Sender: TObject);
    procedure KurveLoeschenClick(Sender: TObject);
    procedure NeueKurveClick(Sender: TObject);
    procedure KurveSpeichernClick(Sender: TObject);
    procedure BerechnenClick(Sender: TObject);
    procedure ZuruecksetzenClick(Sender: TObject);
    procedure Speichern1Click(Sender: TObject);
    procedure Laden1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  datei: file of Polsterkurven;
  hoehe, hzud, sigma, masse, pdicke, pflaeche, gwert : single;
  laenge, breite, x, y, z : integer;
implementation

{$R *.dfm}

.......................
.......................
.........................

//====================BEGINN(STREAMDATEI ÖFFNEN/SCHLIEßEN)======================
// Datei öffnen
procedure TForm1.FormCreate(Sender: TObject);
begin
    AssignFile(datei,'polsterkurven.str');
      if FileExists('polsterkurven.str') then ReSet(datei)
      else ReWrite(datei);
end;

//Datei schließen
procedure TForm1.FormDestroy(Sender: TObject);
begin
    CloseFile(datei);
end;

//Positionieren
procedure TForm1.positionieren(datensatz: integer);
var aktDS: Polsterkurven;

begin
  if (datensatz<0) or (datensatz>=FileSize(datei)) then exit
  else begin
    seek(datei, datensatz);
    read(datei, aktds);
    E_HzuD.text:= floattostr(aktDS.hzud);
    E_A0.text:= floattostr(aktds.A0);
    E_A1.text:= FloatToStr(aktds.A1);
    E_A2.text:= floattoStr(aktds.A2);
    E_Xmin.text:= floattoStr(aktds.xmin);
    E_Ymin.text:= floattoStr(aktds.ymin);
  end;

end;

procedure TForm1.ErstekurveClick(Sender: TObject);
begin
    positionieren(0);
end;

procedure TForm1.VorigeKurveClick(Sender: TObject);
begin
    positionieren(FilePos(datei)-2);
end;



procedure TForm1.NaechsteKurveClick(Sender: TObject);
begin
    positionieren(FilePos(datei));
end;

procedure TForm1.LetzteKurveClick(Sender: TObject);
begin
    positionieren(FileSize(datei)-1);
end;

// Kurve löschen
procedure TForm1.KurveLoeschenClick(Sender: TObject);
var
    Buffer: array[0..BufferSize - 1] of Polsterkurven;
    i : Integer;
    StartRecord, EndRecord: Integer;
    Max: Integer;

begin
    // Datenzeiger wird VOR den akt. Datensatz gesetzt
    Seek(Datei, FilePos(Datei)-1);
    // Starten mit dem ersten Datensatz hinter dem zu löschenden
    StartRecord := FilePos(Datei) + 1;
    EndRecord := FileSize(Datei);

  while StartRecord < EndRecord do begin

    // max. BufferSize Datensätze lesen
    Max := BufferSize;
  if Max > EndRecord - StartRecord then
    Max := EndRecord - StartRecord;
    Seek(Datei, StartRecord);
  for i := 0 to Max - 1 do
    Read(Datei, Buffer[i]);

    // Datensätze zurückschreiben
    Seek(Datei, StartRecord - 1);
  for i := 0 to Max - 1 do
    Write(Datei, Buffer[i]);
    inc(StartRecord);
  end;

    // Datei ab hier abschneiden
    Truncate(Datei);
    Positionieren(StartRecord-2);
end;

// Neue Kurve
procedure TForm1.NeueKurveClick(Sender: TObject);
var
     Buffer: array[0..BufferSize - 1] of Polsterkurven;
     i, p: integer;
begin
     Seek(datei,0);
     p:=0;
  while not eof(datei) do begin //solange lesen, bis die Datei zu Ende ist
//     Read(datei, Buffer[p]);
     fs.Read(datei, Buffer(p));
     inc(p);
  if p > 9 then      //entspr. p:=p+1
  exit;
  end;
     CloseFile(datei); //Datei schließen...
     Buffer[p+1].HZUD:= 0; //Am Ende leeren Datensatz anhängen
     Buffer[p+1].a0:= 0;
     Buffer[p+1].a1:= 0;
     Buffer[p+1].a2:= 0;
     Buffer[p+1].xmin:= 0;
     Buffer[p+1].ymin:= 0;

     ReWrite(datei);  //... und neu anlegen
  for i:=0 to p do write(datei, Buffer[i]);
     //Datensätze (bis auf letzten) in Datei schreiben
     positionieren(FileSize(datei)-1);
     //Dateizeiger auf letzten Datensatz positionieren
end;


procedure TForm1.KurveSpeichernClick(Sender: TObject);
var datensatz: Polsterkurven;
begin
     // Datenzeiger VOR den aktuellen Datensatz setzen
     Seek(Datei,FilePos(Datei)-1);
     datensatz.hzud:= strtofloat(E_HzuD.Text);
     datensatz.A0:=strtofloat(E_A0.Text);
     datensatz.A1:=StrTofloat(E_A1.Text);
     datensatz.A2:=strtofloat(E_A2.Text);
     datensatz.xmin:=strtofloat(E_Xmin.Text);
     datensatz.ymin:=strtofloat(E_Ymin.Text);
     write(datei,datensatz);
     positionieren(0);
end;
//====================ENDE(STREAMDATEI ÖFFNEN/SCHLIEßEN)========================


Zuletzt bearbeitet von Bull80 am So 08.10.06 18:15, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.10.06 18:12 
Ähh, wär schön, wenn du Delphi-Tags benutzt, damit es auch wie Delphi-Code formatiert ist. Entweder über dem Eingabefeld auf Bereiche und dann vor und nach der Codeeingabe auf Delphi klicken oder manuell [delphi] vor und [/delphi] nach dem Code hinschreiben.
Bull80 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

mal dies, mal das

BeitragVerfasst: So 08.10.06 18:16 
sorry, hatte ich voll vergessen. kannst du mir denn evtl. weiterhelfen?
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.10.06 18:46 
nach meinem eindruck verwendest du keine streams sondern typisierte dateien. schau dir hierzu doch mal das folgende tutorial an.

www.dsdt.info/tutorials/typdateien/

schau dir hierzu noch die dateiöffnungsmodi append und reset in der delphi hilfe an.

<HTH>
Bull80 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

mal dies, mal das

BeitragVerfasst: So 08.10.06 18:55 
vielen dank @ Grenzgaenger. bin frischling auf diesem gebiet und kann dazu nur sagen, das ich eine datei mit der endung .str habe und unser prof in seiner aufgabenstellung von einer streamdatei spricht. in dieser sind datensätze enthalten, mit denen wir arbeiten sollen. oder hat der inhalt als solches absolut nichts mit einem stream zu tun? würde mich stark wundern, nachdem was ich darüber alles schon gelesen habe.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.10.06 19:06 
in der tat, der inhalt einer datei hat mit der endung rein gar nix zu tun.

eine stream datei ist einfach eine untypisierte datei, bei der die einzelnen instanzen eines objektes in einer definierten reienfolge aufgerufen werden mit der message eine bestimme operation auf einen stream durchzuführen.

wenn du das ganze nachbasteln möchtest, gerne.. in den delphi streams ist zudem noch die versionsnummer der objekte implementiert, aber das kannst du alles aus den quellcode herauslesen.

hier, vergiss mal deinen prof und kümmer dich einfach um das problem. der begriff streams führt nur jeden in die irre und ist zudem nicht angebracht.

PS: bei typisierten dateien hast du einen record
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  Polsterkurven = record //hier typisierte datei
    hzud, a0, a1, a2, Xmin, Ymin : single;
  end;


bei streams hättest du ein objekt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  Polsterkurven = object
    hzud, a0, a1, a2, Xmin, Ymin : single;
    procedure readfromfile(dateiname: string); //hier stream
    procedure writefromfile(dateiname: string);
  end;
Bull80 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

mal dies, mal das

BeitragVerfasst: So 08.10.06 19:31 
hab erstmal vielen dank. ein kleiner fortschritt.