Was ist der Unterschied zwischen fmemopen und open_memstream?

Lesezeit: 2 Minuten

Benutzeravatar von Bryan Way
Bryan Weg

Beim Durchlesen der GNU-Dokumentation weiter String-Streams Ich habe zwei ähnliche Funktionen gefunden, die sehr ähnliche Dinge tun:

FILE * fmemopen (void *buf, size_t size, const char *opentype)
FILE * open_memstream (char **ptr, size_t *sizeloc)

Nach dem Lesen der Dokumentation scheint es open_memstream sollte zum Öffnen eines Ausgabestreams und verwendet werden fmemopen für die Eingabe. Was mich fesselt ist die opentype Argument, zu dem Sie übergehen können fmemopen.

Das Linux Manpage erklärt:

Wenn buf als NULL angegeben ist, weist fmemopen() dynamisch eine Byte lange Puffergröße zu. Dies ist nützlich für eine Anwendung, die Daten in einen temporären Puffer schreiben und dann wieder zurücklesen möchte. Der Puffer wird automatisch freigegeben, wenn der Stream geschlossen wird. Beachten Sie, dass der Aufrufer keine Möglichkeit hat, einen Zeiger auf den temporären Puffer zu erhalten, der von diesem Aufruf zugewiesen wurde (siehe aber unten open_memstream()).

Was wäre also der Sinn der Verwendung open_memstream wenn fmemopen kann mit dem Öffnen eines Eingabe-/Ausgabestroms umgehen?

Mit fmemopen, wird der Puffer beim oder vor dem Öffnen zugewiesen und ändert seine Größe später nicht. Wenn Sie darauf schreiben, müssen Sie wissen, wie groß Ihre Ausgabe sein wird, bevor Sie beginnen. Mit open_memstream Der Puffer wächst, während Sie schreiben.

  • Ah ich sehe. Guter Einblick, die Manpage für fmemopen hat das nicht explizit angegeben, aber ich sehe jetzt, dass es impliziert ist.

    – Bryan Way

    24. April 2015 um 21:26 Uhr

Ciro Santilli Benutzeravatar von OurBigBook.com
Ciro Santilli OurBigBook.com

Das FILE* zum open_memstream ist schreibgeschützt

Posix http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html

Diese Funktionen ähneln fmemopen(), außer dass der Speicher immer dynamisch von der Funktion zugewiesen wird und der Stream nur für die Ausgabe geöffnet wird.

Neben der dynamischen Zuordnung gibt es also noch einen zweiten Unterschied: Die Datei wird nur zum Schreiben geöffnet.

Und da Sie die Flags offener Streams nicht ändern können, sollten Sie nicht aus dem Stream lesen können.

Es scheint jedoch, dass einige Implementierungen dies zulassen: Kann ich den von open_memstream() erzeugten Stream lesen?

1433100cookie-checkWas ist der Unterschied zwischen fmemopen und open_memstream?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy