Record-Datei verlängern
Record-Datei verlängern
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
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
Ich glaube was du brauchst ist Append, da, wie du schon festgestellt hast, ReWrite die Datei überschreibt.
Ich hoffe das hilft weiter.
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
- 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
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
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 ...
Re: Record-Datei verlängern
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
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
Re: Record-Datei verlängern
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:
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
Wenn ich mir das so anschaue, dann fehlt mir nach den Write-Befehlen das abschließende CloseFile(DatFile);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.
- af0815
- Lazarusforum e. V.
- Beiträge: 7247
- 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
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);
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
Nach meiner Erkenntnis wird mit ReWrite(Datfile,rs) eine neue leere Datei erstellt!af0815 hat geschrieben: Fr 27. Mär 2026, 18:42Code: 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);
Das anschließende
Code: Alles auswählen
AnzRec:=FileSize(DatFile);Das nochmals anschließende
Code: Alles auswählen
Seek(DatFile,AnzRec);Re: Record-Datei verlängern
Hallo
Ich habe in der Sequenz meiner ersten Anfrage das Rewrite durch Reset ersetzt, dann funktionierts! Problem gelöst!
Gruss
Uli
Ich habe in der Sequenz meiner ersten Anfrage das Rewrite durch Reset ersetzt, dann funktionierts! Problem gelöst!
Gruss
Uli
- af0815
- Lazarusforum e. V.
- Beiträge: 7247
- 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
Es steht ja auch im Kleingedruckten in der Beschreibung von ReWrite ja drinnen (Habe ich auch überlesen):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
Aber Achtung, die Datei muss für Reset existieren! Und du solltest immer mit IOResult arbeiten umzu sehen ob alles geklappt hat.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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Record-Datei verlängern
Ich kontrolliere schon, ob die Datei existiert und IOResult frage ich auch ab.
Gruus
Uli
Gruus
Uli