2015-12-03 4 views
5

Meiner Kenntnis nach gibt es keine Libc, die getline() entspricht, die mit einem Dateideskriptor arbeitet, anstatt mit einem FILE * zu arbeiten.getline() mit einem Dateideskriptor anstelle eines Dateizeigers

Gibt es einen (technischen) Grund dafür?

+1

'getline' ist nicht von der C-Norm, ich nehme an, Sie meinen die POSIX-Funktion? –

+0

Begriff Dateideskriptor ist so subjektiv, dass es alles von einer IOFile zu einem Socket sein kann. so lesen Zeile möglicherweise nicht eine richtige Methode zu implementieren, es sei denn, es ist sehr viel mit FILEs –

Antwort

7

Sie können einen FILE-Stream aus einem Dateideskriptor mit fdopen erstellen.

Um eine Zeile aus einem Dateideskriptor generisch zu bekommen, müssen Sie das Betriebssystem für ein Zeichen nach dem anderen fragen, und das ist sehr ineffizient. (Die in POSIX-Shells eingebaute read funktioniert wie diese - sie liest Zeilen sehr ineffizient durch Abrufen eines Bytes.)

FILE-Streams fragen in Batch-Daten nach Daten vom Betriebssystem, was die Effizienz verbessert, der Dateideskriptor jedoch nicht eine zurückspulbare Datei sein - es könnte ein Socket oder eine Pipe sein, und wenn Sie nach 100 Zeichen fragen und das dritte Zeichen dieses 100 Stapels das Newline-Zeichen ist, gibt es keine Möglichkeit, das Lesen der 97 Zeichen danach rückgängig zu machen.

+0

Sie müssen nicht das Betriebssystem ein Char auf einmal fragen, eine einfache Implementierung ist möglich mit einem statischen Puffer, um so viele Bytes auf einmal zu holen wie du es vom Betriebssystem willst. Dies war eigentlich eine Kodierung Übung in der Schule, in der ich studierte, Epitech, get_next_line. Ich bin mir sicher, dass Sie auf GitHub viele Studentenprojekte mit diesem Namen finden können. Beachten Sie, dass Sie, wenn Sie einen von ihnen verwenden möchten, einen erhalten sollten, der die Dateideskriptoren in einem Array hält, um mehrere Dateien gleichzeitig verarbeiten zu können. – deb0ch

+1

@ deb0ch Sicher. Aber dann haben Sie mehr als nur die eine Zeile gelesen, was bedeutet, dass Ihre nachfolgenden Zugriffe auf die Datei deaktiviert sind, es sei denn, Sie a) verwenden weiterhin Ihre Pufferschicht b) spulen zurück. Und b) ist nicht immer möglich, da nicht alle Dateien zurückgespult werden können. – PSkocik

+0

Ja, deshalb habe ich über einen statischen Puffer gesprochen, um ihn in nachfolgenden Aufrufen wiederzuverwenden und die bereits im Puffer vorhandenen Zeilen zu verbrauchen, bevor neue Daten abgerufen werden. Vielleicht wäre etwas Arbeit nötig, um es zwischen close() und open() verlässlich zu machen, was die selbe fd für eine andere Datei liefert, aber mein Punkt ist nur, dass es technisch möglich ist. – deb0ch