fread, nur bestimmte Anzahl von Bytes lesen
-
Hallo,
ich möchte gerne mit fread eine bestimmte Anzahl von Bytes auslesen. Ich könnte zwar sowas machen:
fread(buf, 1024, 1, inFile);
Aber was ist, wenn die Datei sehr groß ist? Ich kann ja nicht in einem Rutsch eine sehr große Datei auslesen...
Also im Prinzip müsste ich so lange lesen, bis ich x Zeichen gelesen habe. Aber dazu müsste ich immer nur ein Zeichen lesen... Nicht sehr toll, oder?
Wie soll ich das machen?
-
Wieso immer nur ein Zeichen ? Es können gern auch zwei oder mehr sein. Es können z.B. auch 300 Megabyte sein, wenn es dein RAM hergibt.
-
Meine Datei ist z.B. so aufgebaut:
Byte 0 bis Byte 3000 = Sektor 1 Byte 3000 bis Byte 75342 = Sektor 2 etc...
Jetzt setze ich meine Position mit fseek auf 3000. Und jetzt möchte ich 72342 Bytes lesen, da 75342-3000 = 72342.
Und das ist mein Problem. Wenn ich mit einem Buffer der Größe 1024 arbeite, dann habe ich ja evtl. schon zu viel gelesen. Um also passend zu lesen, kann ich immer nur ein Zeichen lesen. Das ist aber reichlich unpraktisch bei so großen Dateien. Und die gesamte Datei möchte ich auch nicht in den Speicher laden, da die Datei durchaus mehrere Gigabyte haben kann.
Wie soll ich das also angehen? Ich möchte eben diese 72342 Bytes einlesen, aber eben auch nur Häppchenweise. Und wie ich das mit fread mache ist mir nicht klar.
Irgendwie so ähnlich, aber wies genau aussehen muss, da brauche ich eure Hilfe:
while ((bytesRead = fread(...) != 0) { if (bytesRead > 72342) { break; // Genug } }
-
72342 Bytes auf einmal zu lesen, sollte doch kein Problem darstellen ?
Wenn es aber unbedingt häppchenweise sein muss:
Am einfachsten machst du die Häppchen so groß, das sie ein Teiler von deinen 72342 Bytes sind z.B. 12057 oder sowas.
Findet sich kein ganzzahliger Teiler, in beiden Fällen brauchst du nen zweiten Zähler für deine Bytes:unsigned long counter = 0; while ((bytesRead = fread(...) != 0) { counter += bytesRead if (counter > 72342) { break; // Genug } }
Gruß,
B.B.
-
B.B. schrieb:
Am einfachsten machst du die Häppchen so groß, das sie ein Teiler von deinen 72342 Bytes sind z.B. 12057 oder sowas.
ach, wieso? ich würde auf verdacht 'ne zweierpotenz nehmen. 4096 oder sowas.
-
[quote="~frickyach, wieso? ich würde auf verdacht 'ne zweierpotenz nehmen. 4096 oder sowas.
:)[/quote]Weil man dann mit dem Puffer nicht mehr so rumfrickeln muss, wenn zu viel eingelesen wird. Falls man dann weiterlesen möchte muss man im Puffer navigieren.