Wie kann ich eine Textdatei rückwärts auslesen??
-
Er kann auch gleich die komplette Datei zeilenweise auslesen und die die ausgelesenen
Zeilen einfach rueckwaerts ausgeben/verarbeiten. Warum den umstaendlichen Weg mit dem
merken von Dateizeigerpositionen?mfg
v R
-
Hast du das schon mal mit 500 MB probiert.
Mit meiner Methode bin ich schwerpunktmäßig Größenunabhängig, sofern die Liste oder das Array nicht den Speicher sprengt.
Sollten die Dateien klein sein, hast du recht.
-
@PAD
Dann würde ich aber gleich ne Index-Datei empfehlen, in der die Sprungmarken (nenn ich jetzt einfach mal so) gespeichert werden.
-
PAD schrieb:
Mit meiner Methode bin ich schwerpunktmäßig Größenunabhängig
Nachteil: Geht aber nur auf 'seek-baren' 'Dateien'.
-
@AJ Dann muss er die Sprungmarkendatei rückwärts lesen um dann die Elemente aus der Datendatei zu holen. (Thema ein Loch ist im Eimer ....)
Dauert noch länger als mein schon langsames Verfahren, braucht zweite Datei.@Daniel E. Titel ist:
Wie kann ich eine Textdatei rückwärts auslesen??
somit seekbar. Wenn andere Delimiter als \n vorhanden sind nimmt man die
wenn die Datensätze eine feste Länge haben wird einfacher.
Wenn ich Pascal-Strings (Ein Wort länge des Strings danach alle Zeichen von 00..0xff erlaubt) merke ich mit die Positionen der Längenangaben als 'delimiter'
-
PAD schrieb:
Titel ist:
Wie kann ich eine Textdatei rückwärts auslesen??
somit seekbar.
Ach so, ob etwas eine Textdatei ist, oder nicht, hängt also davon ab, ob man fseek darauf anwenden kann. Man kann also keine Textdateien mit alten Bandlaufwerken speichern?
-
:p Hab auch schon fseek bei Bandlaufwerken angewendet (PDP 11 VMS), war irre schnell und sah toll aus. :p
Machbar schon aber nicht sinnvoll.
Ging besser als man die gesamte Datei auf Platte holte und dann damit arbeitete.Das seekbar bezog sich eher darauf ob die Datei ein Struktur hat, nachdem man die Datensätze trennen
kann, nur bei derartigen Datensätzen macht es ja auch Sinn etwas Datensatzweise von hinten nach vorne zu lesen. Außerdem hatte ich ja nicht nur ASCII-Textdateien als Beispiele aufgeführtTrotzdem viel Spaß
-
@PAD
Man kann die Index-Datei ja auch Rückwärts laufen lassen. Am Anfang würde also der Index für die letzte Zeile stehen. Die Index-Datei wäre also schneller. Besonders, weil er nicht jedes mal die ganze Datei durchfetzen und die Indizes neu suchen muss.
-
@aj das musste jetzt mal ein bisschen genauer erklären.
Wenn ich ein File linear von vorne nach hinten durchsuche bekomme ich die Indices der gleichen Reihefolge wie die Daten. Falls ich den index nicht im Speicher halte, wie soll ich ihn dann rückwärts speichern. Bin wirklich neugierig
-
... fp=fopen("datei.dat", "r"); indizes[0]=0; for(anz=1;fgets(fp, zeile, sizeof(zeile));++anz) { indizes[anz]=ftell(fp); } ... ip=fopen("datei.idx", "w"); for(i=anz;i>-1;--i) { fprintf(ip, "%ld", indizes[i]); } ...
Ist es so klarer?? Diesen Code muss man dann nur ausführen, wenn sich die Datei datei.dat ändert. (Ich gehe mal davon aus, dass sich die Datei nicht ständig ändert, sonst wäre ja ein Index sowieso absolut überflüssig.)
Abprüfungen und dynamische Speicherreservierungen hab ich jetzt weggelassen. Würde es nur unnötig aufblähen.
-
D.h. du hälst also den Index während des Aufbaus im Spiecher speicherst in dann erst in umgekehrter Reihenfolge ab (also kein neues Verfahren).
Wenn ich dann den Index im Speicher habe (wie schon beschrieben) kann ich direkt den Index dazu nutzen um die Datei rückwärts auszulesen.
Deine Annahme das man den Index öfters benutzen kann ist zwar richtig aber hier nicht gefordert.
-
Wenn keine Mehrfachverwendung des Index "gefordert" ist, dann ist eine Indezierung absolut überflüssig.
Wenn man jedes mal die Indezes neu errechnet, dann ist das total überflüssig. Dann kann man ja gleich die ganze Datei in den Speicher lesen und von hinten durchgehen, oder??
-
Lies die Diskussion noch mal die Antwort steht oben
-
Na sag ich doch. Warum reden wir dann überhaupt noch über Indizes