AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Strukturierte Daten in Datei speichern

Ein Thema von Luckie · begonnen am 15. Feb 2003 · letzter Beitrag vom 15. Feb 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Strukturierte Daten in Datei speichern

  Alt 15. Feb 2003, 21:30
Folgendes: Ich habe Daten in Form Überschrift und dazu einen Text und das immer abwechselnd. Dies wollte ich jetzt abspeichern.

Nur wie?

Typisierte Datei mit Records ist schlecht, da man da ja nur ShortStrings verwenden kann, der Text kann aber leider größer werden als 255 Zeichen.
Jetzt dachte ich, kuckst du dir doch mal TFileStream an. Gesagt, getan. Also ich weiß nicht ob es damit geht oder nicht. Und wenn es geht, dann wüßte ich nicht wie. Das Problem ist halt, dass die Textlänge sehr variable ist.
Nachtrag: Ein nachträgliches Bearbeiten soll auch möglich sein.

Irgendwelche Ideen, Vorschlage, Lösungen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 15. Feb 2003, 21:35
Vielleicht hilft dir das bei TFileStream:

Delphi-Quellcode:
// schreibt 4 Bytes Stringlänge und danach S
procedure WriteStreamStr(Stream: TStream; const S: String);
var len: Cardinal;
begin
  len := Length(S);
  Stream.Write(len, SizeOf(len));
  if len > 0 then Stream.Write(S[1], len);
end;

// liest was WriteStreamStr geschrieben hat
procedure ReadStreamStr(Stream: TStream; var S: String);
var len: Cardinal;
begin
  Stream.Read(len, SizeOf(len));
  SetLength(S, len);
  if len > 0 then Stream.Read(S[1], len);
end;

// liest was WriteStreamStr geschrieben hat
function ReadStreamStr(Stream: TStream): String;
begin
  ReadStreamStr(Stream, Result);
end;
Damit kannst du Strings mit der theoretischen Länge von 4 GB schreiben und einlesen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 15. Feb 2003, 21:42
Gut. Ich glaube, das habe ich verstanden.

Aber:
Code:
Titel
TextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextText
TextTextTextTextTextTextTextTextText
TextTextTextText
Titel
TextTextTextTextText
TextTextText
TextTextTextTextTextText
Titel
TextTextText
TextTextTextText
Titel
TextTextTextTextText
TextTextTextTextText
TextTextText
Woher weiß ich jetzt, wo was anfängt und aufhört?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4
  Alt 15. Feb 2003, 21:47
Ich dachte du hast die Daten bereits im Speicher, dann kannst du mit

Delphi-Quellcode:
procedure WriteEntry(Stream: TFileStream; const Entry: TEntry);
begin
  WriteStreamStr(Stream, Entry.Titel);
  WriteStreamStr(Stream, Entry.Lines.Text);
end;

function ReadEntry(Stream: TFileStream): TEntry;
begin
  Result.Titel := ReadStreamStr(Stream);
  Result.Lines.Text := ReadStreamStr(Stream);
end;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 15. Feb 2003, 21:48
Du musst irgendeine Art Trennzeichen einführen denn irgendeine Information darüber, wie die Daten gegliedert sind, brauchst du ja bei erneutem Einlesen. Also Trennzeichen oder Header-Block mit Byte-Anzahl.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 15. Feb 2003, 21:50
Das mit dem Header würde mir am ehesten zusagen.

Wie könnte denn so ein Header aussehen? Der muß ja auch dynamisch sein. Wenn am Tect was geändert wird oder wenn was rausgelöscht wird usw.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 15. Feb 2003, 22:00
Du könntest eine Art "Speicherverwaltung" auf Dateibasis bauen.
Delphi-Quellcode:
THeader = packed record
  TitelLen: Integer;
  TextLen: Integer;
  TitelPos: Longword; // Dateiposition des Titels (bei 0: Freier Block)
  TextPos: Longword; // Dateiposition des Textes
  Next: Longword; // Dateiposition des nächsten Headers (bei 0: Letzter Block)
end;
Dadurch dass du den Header von den eigentlichen Daten trennst, kannst du den Titel und Text an einer völlig anderen Stelle in der Datei ablegen. Sollte also der Platz nicht mehr ausreichen, so verlegst du die Daten einfach an eine Stelle, an der genug Platz vorhanden ist, oder vergrößerst die Datei.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 15. Feb 2003, 22:00
Du musst eben irgendwie reinschreiben, wieviel Bytes der folgende Speicherblock enthält, oder, falls es nur-Text-Daten sind, auch die Zeilenanzahl. Also so zum Beispiel:
mit Zeilen:
Code:
5
Titel
TextTextTextText
Text
Text
TextTextText
2
Titel
TextText
4
Titel
TextTextText
Text
Text
TextTextTextText
oder eben mit der Byte-Länge:
Code:
54
Titel
Das ist ein kurzer Text, der 49 Zeichen lang ist.
Hier müsstest du also die Zahl in der ersten Zeile einlesen, einen weiteren Zeilenumruch überspringen und dann die nächsten 54 Bytes (ist nur überschlagen, können im Beispiel auch 53 oder 55 sein) einlesen. Alternativ wären zwei Längenangaben, wenn du Titel und Text trennen willst.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9
  Alt 15. Feb 2003, 22:04
Ich glaube Chewie und ich denken an unterschiedliche Intentionen deiner Seits Luckie. Dadurch das du von Typisierten Dateien sprachst, bin ich natürlich in Richtung Datenbank ausgeschert.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 15. Feb 2003, 22:09
@jbg: Ist gar nicht so schlimm. Dadurch ergeben sich eventuell neue Möglichkeiten, wenn man das von zwei unterschiedlichen Seiten angeht. Aber lies dir noch mal durch, was ich genau in meinem ersten Posting geschrieben habe. Bisher gefällt mir deien Idee noch am besten. Die Idee von Chewie sieht mir mehr so nach einer basteln Lösung aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:01 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