Ist seekg praktisch notwendig?
-
Hi,
klar,
seekgsoll schon drin bleiben, die Frage ist jedoch: Wenn man richtig liest, muss man dann jemals "zurückgehen"? Eigentlich liest man dann doch in einem Rutsch?
Und wann könnte man schon in einer Datei hin und her springen? Wenn man schnell an verschiedene Daten in der Datei ran muss, läd man die doch einfach ins Programm.
Mehr Anwendungsfälle kann ich mir auf die Schnelle nicht ausdenken.Wo braucht man das also in der Praxis?
MfG
-
Ein Anwendungsfall von Wireshark ist zum Beispiel folender:
Es soll ein großes Caputurefile geladen werden mit mehreren Millionen Telegrammen. Die Dateigröße ist einige GB groß. In den Speicher kannst du auch nicht alles laden, weil a - soviel gar nicht reinpasst und b - der User vielleicht nicht alle Daten anschauen will. Was machst du:
- Durch die Datei laufen und jedes Telegram parsen und verarbeiten.
- Dabei offset Position und Länge des Telegrams in der Datei speichern.
- Telegram verwerfen und zum nächsten fortfahren.
- Wenn der User ein bestimmtes Telegram anspringt, seekst du zu der Stelle in der Datei und liest das Telegram in den Speicher rein.Quasi, copy on access
Du liest also nur die Information komplett aus, wenn sie benötigt werden. Ansonsten reicht dir nur die Information wo du was findest (offset) der Inhalt aber erstmal nicht.
-
Einfachstes Beispiel: Datenbank.
Du hast N Records in der Datei abgelegt und willst den 27. haben -> seek
-
Ah, natürlich. Dass die File zu groß zum Laden ist, da hab ich nicht dran gedacht.
Da istseekgnatürlich der Kandidat, thxEinfachstes Beispiel: Datenbank.
Du hast N Records in der Datei abgelegt und willst den 27. haben -> seek
Klar, zum Vorwärtsspringen braucht man es natürlich.... am Anfang den Filepointer in die richtige Position bringen, klar.

Ich meinte mehr speziell das Rückwärtsspringen, wie es in einem Thread hier gefragt wurde.
-
Oder du hast ein grosses Archiv (z.B. tar oder zip) und willst ein Verzeichnis entpacken. Erst springst du an die richtige Position, wie im Fileheader angegeben. Dann enthält das Verzeichnis einen symbolischen Link -> möglicherweise musst du rückwärts springen.
Oder die Datenbank, die öffnest du auch nicht für jede Anfrage neu. Erst willst du den 27. Eintrag haben -> seekg. Dann den 13. -> seek back.
-
Sone schrieb:
Ich meinte mehr speziell das Rückwärtsspringen, wie es in einem Thread hier gefragt wurde.
Immernoch Datenbank. Du willst nachdem du den 27. Record hast, jetzt den 12. haben
Du schließt das Dateihandle ja nicht dauernd.
-
Jegliche Form von Datenbanken und Archiven, das wurde ja schon genannt.
Aber auch z.B. bei tail-ähnlichen Tools. Wie viele Bytes du lesen musst, kannst du vorher nur raten, du wirst also gelegentlich zurückspringen müssen.
-
Gut, das klingt einleuchtend. Ich dachte halt, bei einem so banalen Beispiel mit 27.en oder 13.en Einträgen kann es nicht schlimm sein, die ganze DB einzulesen, aber ich denke, echte DBs sind da sehr viel größer (> 100K Einträge)?
Na dann, Frage hat sich geklärt, vielen Dank!