Tag,
Das Einlesen in Blöcken sit da bestimmt eleganter. Nur liegen die
Zeilenenden dann irgendwie, aber garantiert nicht auf Blockgrenze.
Deswegen sollst du ja auch keine Bloecke, sondern Zeilen einlesen ;-)
Gerade bei einer Sprache wie PHP koennte ich mir vorstellen, dass sie
intern mit Lese-Puffern arbeitet.
Ich werde wohl nicht drum herumkommen, doch beide Wege zu
gehen: C UND das blockweise Lesen.
Warum? Dateien sind keine Streams, fuer sowas gibt es doch fgets().
Ansonsten benutze halt I/O-Vektoren (vread()). Die Puffer dort
duerften effizienter sein, als du es implementieren koenntest.
Genau das ist das Problem. Man muss wahrscheinlich im BIN-Mode
blind reingreifen in die Datei, éinen Block lesen, den Rest der
ersten Zeile wegschmeißen, den Anfang der letzten Zeile
wegschmeißen, dann den neuen Einsprungspunkt berechnen für den
nächsten Block (es ändert sich ja zum Glück nix mehr am alte Teil
der Datei) usw usw.
Wenn es wirklich neue Zeilen gibt und du nur einen Teil verarbeiten
musst, dann ist der Weg, den ich unten Beschrieben habe (fseek()),
der sinnvollste.
Eine einfache wäre sicher sich die Zeilenanzahl zu merken
und dann von dort an immer weiterzuarbeiten und die
Zeilenanzahl erhöhen.
Sinnlos. Dann muesste man ja die Zeilen trotzdem alle einlesen.
Ja, wir haben variable Satzlänge. Ein DirectAccess ist also nicht
möglich.
Doch. Habe ich doch geschrieben: alte Groesse der Datei speichern,
vor dem oeffnen einen stat() absetzen und mit fseek() den Filepointer
an die Stelle neuegroesse-altegroesse setzen. Dann solltest du am
Anfang der ersten neuen Zeile stehen.
Ich denke so ist es am besten, denn C ist in deinem Fall
wahrscheinlich nicht in dem Maße schneller wie Du Dir das
vorstellst.
Das wäre eben auszuprobieen. Nur ich trau mich nicht. Mit C kann
man sooo schön daneben greifen und dann ist der Server platt.
Hae?
Mit C kann man genau so viel oder wenig kaputt machen wie mit PHP.
Das Schlimmste, was dir passieren kann, ist ein core dump, solange
du nicht mit produktiven Daten testest.
Gruesse,
CK