Einzelnen Beitrag anzeigen

Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#9

Re: Textdatei zum Lesen & Schreiben öffnen

  Alt 14. Mär 2007, 17:15
Ich hatte grad schon wieder ne neue Idee

Eine verkette Liste mit Strings...

Delphi-Quellcode:
TLine = class
  Next, Prev: TLine;
  Text: String;
  Changed: Boolean; //2 Byte?
end;
jedes repräsentiert eine Zeile...
Vorteil:
man könnte einmal die Datei "analysieren" und sich die Liste aufbauen (erzeugt natürlich Overhead 10 Byte pro Zeile ist leider nicht wenig... )

Nun wird zum Laden einfach mittels eines gemoddeten TFileStreams zur x'ten Zeile gesprungen (x = Pos-(Bufsize div 2)) und mittels FS.ReadLn geladen. Alles was ausserhalb des gebufferten Bereichs liegt und nicht geändert wurde wird geleert (Text:=''

Somit befindet sich immer nur der Overhead, die gebufferten Zeilen und die geänderten Zeilen im Speicher. Ich denke deutlich besser geht es nicht^^
Beispielrechung (Das Beispiel ist eine (der kleineren) Datei die ich vorliegen hab, also durchaus realistisch ):
2 Mio Zeilen
ca. 50 Zeichen/Zeile
1000 Zeilen editiert
Buffer: 100000 Zeilen

Dateigröße: 2Mio * 50 = 100MB
Overhead: 10*2Mio = 20MB
Buffer: 100000*50 = 5MB
Geändert: 1000*50 = 50KB (Die höchstwahrscheinlich schon im Buffer sind)

Das ganze ist eigentlich genial:
Einfügen von Zeilen ist dank der verketteten Liste ein Kinderspiel, einfügen von Buchstaben kann in handlichen Stücken (in der Zeile) erfolgen. Löschen ist ebenfalls kein Problem.

Einziges Problem ist das Speichern, aber auch das sollte gar nicht so schwer sein...Mein Ansatz: Speichern in eine neue Datei, alte Datei löschen, neue umbenennen, fertig.
Also Zeile für Zeile durchgehen, falls was im Buffer steht das nehmen, ansonsten aus der alten Datei lesen.
Event. sogar das 2-Dateien-System an den User weitergeben und mit einer "Quelldatei" und einer "Arbeitsdatei" basteln lassen.

Nun, was natürlich stört ist die Dateigröße...
event. wäre es ja möglich die liste nur so groß zu machen wie der Buffer ist und somit den overhead auf ein minimum beschränken...
allerdings ist dann das mit dem ändern nicht mehr so schön einfach :-/
ideen?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat