Frédéric: Datei: Zeile x bis y lesen

Hi,

Ich glaube es ist eine der einfacheren Fragen, die schon oft gestellt wurde...

Also, ich will nur die Zeilen x bis y einer Datei lesen. Wie mache ich es am effektivsten?

Hier meine Vorschläge:

1. Die ganze Datei in einer Array speichern
2. Datei zeilenweise lesen, und jedesmal überprüfen, ob die Nummer der Zeile gleich x und/oder gleich y ist.
3. Mit der Funktion seek (ich habe noch nie mit dieser Funktion gearbeitet, wäre aber schon eine Lösung oder?)

  1. Hi,

    Hier meine Vorschläge:

    1. Die ganze Datei in einer Array speichern

    Bei kleinen Dateien machbar. Bei großen sehr speicheraufwendig.

    1. Datei zeilenweise lesen, und jedesmal überprüfen, ob die Nummer der Zeile gleich x und/oder gleich y ist.

    In einer Schleife die Zeilen 1 bis x-1 lesen, aber nicht speichern.
    In einer zweiten Schleife die Zeilen x bis y lesen und speichern.

    1. Mit der Funktion seek (ich habe noch nie mit dieser Funktion gearbeitet, wäre aber schon eine Lösung oder?)

    seek geht nur unter gewissen Voraussetzungen.
    Seek benötigt eine Byteposition, nicht eine Zeilennummer. Da die Zeilenlänge unterschiedlich sein kann, Du also die Byteposition der Zeile x nicht feststellen kannst, ohne die Zeilen einzulesen.

    seek kannst Du also nur verwenden, wenn alle Zeile die gleiche (dir bekannte) Länge haben.

    Andreas

    1. Moin Moin !

      1. Mit der Funktion seek (ich habe noch nie mit dieser Funktion gearbeitet, wäre aber schon eine Lösung oder?)

      seek geht nur unter gewissen Voraussetzungen.
      Seek benötigt eine Byteposition, nicht eine Zeilennummer. Da die Zeilenlänge unterschiedlich sein kann, Du also die Byteposition der Zeile x nicht feststellen kannst, ohne die Zeilen einzulesen.

      seek kannst Du also nur verwenden, wenn alle Zeile die gleiche (dir bekannte) Länge haben.

      Nicht so ganz. Wenn Du immer wieder ein paar Zeilen aus ein und der selben Datei brauchst, und diese Dateisich nicht ändert, kannst Du beim ersten Einlesen einfach alle Datei-Offsets der Zeilenanfänge speichern (ftell(), Vorsicht mit gepufferter I/O der libc!). Danach kannst Du jede Zeile ganz schnell mit seek() anspringen. Zusammen mit der Dateilänge (quasi als Offset der ersten nicht mehr vorhandenen Datei) kannst Du problemlos sogar die Länge der Zeilen ermitteln, einfach als Differenz zum Offset der nächsten Zeile.

      Alexander