Ich benutze eine Bibliothek, die ziemlich viele Funktionen hat, die in ein FILE
schreiben, aber keines, das die gleichen Daten bequem an ein Objekt im Speicher ablegt. Gibt es eine Möglichkeit, ein FILE
-Objekt zu erstellen (oder es außer Kraft zu setzen), das die Daten im Speicher speichert, anstatt auf die Festplatte zu schreiben - ich möchte den Leistungseinbruch beim Öffnen / Schreiben / Lesen von Dateien immer und immer wieder vermeiden .
UPDATE: nach Robs Vorschlag Stringstream ausprobieren:
%Vor%Aber jetzt, wo ich versuche, die Daten (binär) aus dem Stringstream zu bekommen, muss ich feststecken - wie greife ich die Binärdaten, die ich hinzugefügt habe?
Neben den bereits erwähnten GNU's fmemopen()
, welches in POSIX als open_memstream mmap()
(unter Verwendung von MAP_ANONYMOUS) oder einer anderen betriebssystemspezifischen Funktion, die einen Dateideskriptor auf einen Speicherblock zurückgibt, und fdopen()
erhalten werden.
EDIT: das war falsch, mmap erstellt keinen Dateideskriptor.
Die GNU-libc hat z. B. fmemopen
, was Ihnen eine FILE *
gibt, die in den Speicher schreibt. Probieren Sie man fmemopen
auf Ihrem Linux-System für Details.
Ich vermute (aber ich bin mir nicht sicher), dass fmemopen
ein Wrapper ist, der den von @Cubbi erwähnten Ansatz mmap
/ fdopen
orchestriert.
Wenn Sie Mac OS X oder iOS verwenden, haben Sie keinen Zugriff auf fmemopen. Ich habe hier eine Lösung gefunden:
Wenn Sie die Möglichkeit haben, Ihre Bibliothek zu ändern, könnten Sie C ++ - Streams anstelle von C FILE Streams verwenden.
Wenn Ihre alte Bibliotheksfunktion wie folgt aussieht:
%Vor%Sie könnten diesen Code durch ersetzen:
%Vor%Machen Sie dann in Ihrem Nicht-Bibliothekscode Folgendes:
%Vor% Ziehen Sie in Erwägung, tmpfs
zu installieren und die Anwendung dazu schreiben zu lassen. Natürlich ist das nur * nix.
Tags und Links c++ ios file-io memorystream