Record-Datei verlängern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
USchoch
Beiträge: 51
Registriert: Do 16. Mär 2017, 14:01

Record-Datei verlängern

Beitrag von USchoch »

Hallo
Ich erstelle in einem Lazarusprogramm eine Datei .mit einer Anzahl Records von 32 Byte Länge. Irgend wann will ich an diese Datei
eitere Records anhängen.

Das wollte ich mit dieser Sequenz machen:

AssignFile(DatFile,EdDatFN.Text); { Vorhandenes File }
ReWrite(DatFile);
fs:=FileSize(DatFile);
rs:=SizeOf(TMesswerte);
AnzRec:=fs div rs;
Seek(DatFile,AnzRec);

Dann ein paar mal : Write(DatFile,AktmessWerte); { einige Records anhängen }

Das funktioniert nicht. Wenn ich das bestehende File im Explorer ansehe, ist es 95 kB lang. Nach dem AssignFile immer noch,
nach dem Rewrite ist es 0 kB.
Was mach ich falsch?

Gruss
Uli

shokwave
Beiträge: 478
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Record-Datei verlängern

Beitrag von shokwave »

Ich glaube was du brauchst ist Append, da, wie du schon festgestellt hast, ReWrite die Datei überschreibt.

Ich hoffe das hilft weiter.
Zuletzt geändert von shokwave am Fr 27. Mär 2026, 15:18, insgesamt 1-mal geändert.
mfg Ingo

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 712
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.5 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Record-Datei verlängern

Beitrag von Niesi »

Das muss so sein - ReWrite löscht die bisherige Datei und öffnet sie zum Schreiben.

Wenn Du den bisherigen Inhalt erhalten willst, dann musst Du den erst einmal einlesen ...

https://www.freepascal.org/docs-html/rt ... write.html
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

USchoch
Beiträge: 51
Registriert: Do 16. Mär 2017, 14:01

Re: Record-Datei verlängern

Beitrag von USchoch »

Hallo Ingo

In einer Lazarus-Beschreibung heisst es, dass Append nur bei Textfiles funktioniert. Wenn ich Append(DatFile), also das File mit den Records, schreibe, reklamiert der Compiler.
Also keine Lösung

Gruss
Uli

wp_xyz
Beiträge: 5408
Registriert: Fr 8. Apr 2011, 09:01

Re: Record-Datei verlängern

Beitrag von wp_xyz »

Reset statt Append (https://wiki.freepascal.org/binary_file ... f%C3%BCgen)

Aber vielleicht solltest du mal daran denken, statt der klassischen Datei-Prozeduren die vielseitigeren Streams zu verwenden:

Code: Alles auswählen

// Neue Messdaten in die Datei schreiben
var
  stream: TFileStream;
  data: array of TMessWert;
  anzMesswerte: Integer;
begin
  if not FileExists(EdDatFN.Text) then
  begin
    stream := TFileStream.Create(EdDatFN.Text, fmCreate);
    anzMessWerte := 0;
  end else
  begin
    stream := TFileStream.Create(EdDatFN.Text, fmOpenRead);
    stream.Read(anzMesswerte, SizeOf(anzMesswerte));
  end;
  // Stream an den Anfang setzen und neue Anzahl der Messwerte eintragen
  anzMesswerte := anzMesswerte + Length(data);
  stream.Position := 0;
  stream.Write(anzMessWerte, SizeOf(anzMesswerte));
  // ans Stream-Ende gehen und die neuen Messwerte schreiben
  stream.Seek(0, soFromEnd);
  // oder: stream.Position := stream.Size;
    for i := 0 to High(data) do
      stream.Write(data[i], SizeOf(TMesswert));
  // stream schließen - damit wird die Datei geschrieben
  stream.Free;
end;
Zuletzt geändert von wp_xyz am Fr 27. Mär 2026, 17:24, insgesamt 1-mal geändert.

kirchfritz
Beiträge: 266
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 4.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Record-Datei verlängern

Beitrag von kirchfritz »

USchoch hat geschrieben: Fr 27. Mär 2026, 15:00
AssignFile(DatFile,EdDatFN.Text); { Vorhandenes File }
ReWrite(DatFile);
fs:=FileSize(DatFile);
rs:=SizeOf(TMesswerte);
AnzRec:=fs div rs;
Seek(DatFile,AnzRec);

Dann ein paar mal : Write(DatFile,AktmessWerte); { einige Records anhängen }

Das funktioniert nicht.
Wenn ich mir das so anschaue, dann fehlt mir nach den Write-Befehlen das abschließende CloseFile(DatFile);

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7251
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Record-Datei verlängern

Beitrag von af0815 »

Code: Alles auswählen

var
DatFile: File of TMesswerte;

....
rs:=SizeOf(TMesswerte);
AssignFile(DatFile,EdDatFN.Text); { Vorhandenes File }
ReWrite(DatFile,rs); // Size of a Record
AnzRec:=FileSize(DatFile);
Seek(DatFile,AnzRec);
Write(DatFile,AktmessWerte); { einige Records anhängen }
Write(DatFile,AktmessWerte); { einige Records anhängen }
CloseFile(DatFile);
Wenn man mit Record arbeiten will beim Seek, dann sollte man die Größe beim ReWrite mit angeben, ansonsten wird laut Doku https://www.freepascal.org/docs-html/rt ... write.html mit 128 Bytes gearbeitet.

IMHO besser ist die Version die wp gepostet hat, auch vom ganzen Errorhandling her.

Was mit fehlt, wie ist DatFile definiert !! Siehe auch https://www.freepascal.org/docs-html/rt ... esize.html wo es schon bei der Definition wichtig ist, das richtige auszuwählen. Weil, wenn du bereits dort die TMesswerte angegeben hast, so sagt dir bereits Filesize wieviele Recodes du hat. Ansonsten geht auch filesize von 128Bytes Records aus.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

kirchfritz
Beiträge: 266
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 4.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Record-Datei verlängern

Beitrag von kirchfritz »

af0815 hat geschrieben: Fr 27. Mär 2026, 18:42

Code: Alles auswählen

var
DatFile: File of TMesswerte;

....
rs:=SizeOf(TMesswerte);
AssignFile(DatFile,EdDatFN.Text); { Vorhandenes File }
ReWrite(DatFile,rs); // Size of a Record
AnzRec:=FileSize(DatFile);
Seek(DatFile,AnzRec);
Write(DatFile,AktmessWerte); { einige Records anhängen }
Write(DatFile,AktmessWerte); { einige Records anhängen }
CloseFile(DatFile);
Nach meiner Erkenntnis wird mit ReWrite(Datfile,rs) eine neue leere Datei erstellt!
Das anschließende

Code: Alles auswählen

AnzRec:=FileSize(DatFile);
liefert also für AnzRec := 0,
Das nochmals anschließende

Code: Alles auswählen

Seek(DatFile,AnzRec);
müsste folglich sinnlos sein, weil "man" steht sowieso am Anfang einer leeren Datei.

USchoch
Beiträge: 51
Registriert: Do 16. Mär 2017, 14:01

Re: Record-Datei verlängern

Beitrag von USchoch »

Hallo

Ich habe in der Sequenz meiner ersten Anfrage das Rewrite durch Reset ersetzt, dann funktionierts! Problem gelöst!

Gruss
Uli

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7251
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Record-Datei verlängern

Beitrag von af0815 »

USchoch hat geschrieben: Sa 28. Mär 2026, 08:23 Hallo

Ich habe in der Sequenz meiner ersten Anfrage das Rewrite durch Reset ersetzt, dann funktionierts! Problem gelöst!

Gruss
Uli
Es steht ja auch im Kleingedruckten in der Beschreibung von ReWrite ja drinnen (Habe ich auch überlesen):
if Rewrite finds a file with the same name as F, this file is truncated to length 0. If it doesn't find such a file, a new file is created.
Aber Achtung, die Datei muss für Reset existieren! Und du solltest immer mit IOResult arbeiten umzu sehen ob alles geklappt hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

USchoch
Beiträge: 51
Registriert: Do 16. Mär 2017, 14:01

Re: Record-Datei verlängern

Beitrag von USchoch »

Ich kontrolliere schon, ob die Datei existiert und IOResult frage ich auch ab.
Gruus
Uli

Antworten