Eine Datei zeilenweise einlesen.



  • Hallo,
    was haltet ihr von diesem Vorgehen:

    Zwei Variablen a, b vom Typ unsigned long für die Position in der Datei mit 0 initialisieren. Datei öffnen, mit fgetc bis Newline lesen. Position speichern, b = ftell. Zur Postition a zurückkehren, fseek(a). Zeile der Länge b-a mit fread in einen allokierten Puffer schreiben, a = b setzen. Dann wieder bis Newline lesen, usw.

    Es geht hierbei um das Prinzip, nicht um die exakte Umsetzung in eine art Pseudosprache.
    Wird hierbei der Lesekopf unnötigerweise hin- und herbewegt oder macht das nichts?
    Alternativ könnte man auch einen Puffer bestimmter Größe allokieren und bei Bedarf vergrößern, der Lesekopf würde sich immer nur in eine Richtung bewegen.
    Wäre das besser?



  • 1. Wenn du eine Solid-State-Disk hast, dann gibt es auch keinen Lesekopf. Die Frage lässt sich also nicht so pauschal beantworten.

    2. Normalerweise Speichert das Betriebssystem die Daten zwischen. D.h. sie werden in der Regel nicht nochmal von der Festplatte (wenn du eine hast) eingelesen.

    3. Immer den Umweg über das Betriebssystem zu gehen ist doch noch relativ langsam.

    Normalerweise will man ja nicht, dass die Zeilen unendlich lang sein können. Sonst kann man das Programm ja relativ leicht in Speichermangel bringen, in dem man einfach eine sehr lange Zeile in die Datei einfügt und dass Programm dann versucht, einen sehr großen Speicherbereich anzufordern, was dann fehl schlägt.

    Wenn du also eine maximale Zeilenlänge hast, kannst du dir auch wunderbar einen Puffer anlegen, der diese Größe hat.

    Sonst könntest du auch eine einfach verkettete Liste von Puffern fester Größe nehmen, wenn du unbedingt unbegrenzt lange Zeilen einlesen willst.



  • Hi!
    Dem schließe ich mich an. In der Praxis möchte man es mit Zeilenlängen zu tun haben, die für das System 'handlich' sind. Darum macht es Sinn die Zeilenlänge auf eine Maximallänge zu begrenzen, weil sonst die Speicheranforderung für zu lange Zeilen das System in die Knie zwingen kann.


Anmelden zum Antworten