C - erzeugt eine Datei im Speicher
Schreibe ich kleines Programm in plain-C hier.
Was ich brauche, ist eine Datei zu erstellen, direkt im Speicher (nicht geschrieben werden auf der Festplatte)
Derzeit kann ich verwenden fopen("filename.txt,"wb")
zum schreiben in die Datei.
Weiß ich, dass in linux die Sie verwenden können fmemopen()
. Gibt es eine ähnliche Lösung für win32?
- Warum? Sie erwarten/brauchen, um in der Lage sein zu verwenden regelmäßige
FILE *
I/O-Funktionen wiefread()
Lesen aus der Datei, die einmal erstellt? - Was versuchen Sie zu lösen? Was ist Ihr Ziel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
fdopen
ist in POSIX.1-1990, und Windows unterstützt es in form von_fdopen
. Verwenden Sie es zusammen mit_get_osfhandle
und_open_osfhandle
, die es erlaubt, zu bauen bis eine ordnungsgemäßeFILE *
aus einer Windows-DateiHANDLE
das funktioniert mit dem rest der C-standard-Bibliothek. Siehe auch die Frage Ist es ein Windows-äquivalent zu fdopen für Griffe? für weitere Informationen über diese.Nun, den verbleibenden Teil des Problems ist die Schaffung einer Speicher-unterstützt Windows Datei. Es stellt sich heraus gibt es verschiedene Ansätze, die annähernd diese unter NT. Am weitesten verbreitet zu sein scheint:
Erstellen einer temporären Datei; d.h. nicht-persistent. In anderen Worten, verwenden Sie
CreateFile
mit einem Pfad gebaut, ausGetTempPath
und möglicherweiseGetTempFileName
....mit der
FILE_ATTRIBUTE_TEMPORARY
" - Attribut [1]; D. H. Speicher-unterstützt soweit wie möglich....und mit der
FILE_FLAG_DELETE_ON_CLOSE
flag [2]; also deutete an, dass es nie geschrieben werden müssen, es sei denn, es nicht in den Speicher passt.Solange genügend Arbeitsspeicher vorhanden ist, damit die Datei in den Speicher (d.h. tief genug Arbeitsspeicher), wird die Festplatte nicht verwendet werden. Sehen Sie diese MSDN-blogpost von Larry Osterman beschreibt diesen Ansatz. Lustig, er nennt solche Dateien "temporäre" temporäre Dateien.
Beachten Sie, dass dies nicht genau entspricht
fmemopen
, die schlägt fehl, wenn die Datei passt nicht in den vordefinierten Speicherbereich [3] (d.h.fmemopen
setzt einen reinen Speicher-backed-Datei). Doch für viele Zwecke ist es nahe genug (und manchmal auch die potentielle Unterstützung auf der Festplatte haben wollte).Darüber hinaus sehen Wie Sie verhindern, dass die Spülung auf die Festplatte der memory map geöffnet, die auf eine temporäre windows-delete-on-Datei schließen beschreibt für einige Diskussionen in Bezug auf diese Datei-Attribute und mögliche andere Ansätze.
Schließlich für ein vollständiges Beispiel, das verbindet beide Teile (d.h. die Schaffung der Speicher gesicherten Datei und dann wickeln Sie es in eine
FILE *
Griff), werfen Sie einen Blick auf die Implementierungen aus der fmem-Bibliothek (was wurde geschrieben, um eine cross-Plattform Lösung für dieses problem), oder an die, die aus der libconfuse Bibliothek.[1]
[2]
[3]
Solche Funktionalität ist nicht intrinsisch in Windows unterstützt. Allerdings könnte man das umschreiben des high-level-stdio-Funktionen zum Zugriff auf einen Speicher-Puffer statt einer Datei, oder einfach nur implementieren stdio-Funktionen wie. Oder man könnte die Implementierung eines RAM-disk, jedoch die Installation der RAM-disk-Treiber selbst nicht erfüllen kann Ihr "nicht auf die Festplatte schreiben" - Regel.
Würde ich nicht verwenden, fopen, wie dies erstellt eine Datei.
Erstellen Sie die Datei in den Speicher müssen Sie erstellen die Datei und speichern Sie es in irgendeiner Weise, die Sie sehen, passen.
Müssen Sie ein array erstellen, die von einigen Datentyp. Ich würde die Verwendung von char* - aber Sie konnte verwenden, was Sie möchten, codieren Sie die imformation. Sie können dann Lesen und schreiben in die Datei, indem Sie Informationen in das array.
Könnten Sie etwas erreichen, schließen mit MapViewOfFile.
Win32-API, die Sie verwenden sollten, sind:
Vergessen Sie nicht, zu trennen und schließen Sie die Datei-Zuordnung wenn Sie fertig sind.
CreateFile
verwenden Sie ein Datei-handle, das vonINVALID_HANDLE_VALUE
(-1)CreateFileMapping
.Fmemopen
dauert, einen Speicher-Puffer und können Sie behandeln Sie wie eine Datei — es gibt eineFILE*
.MapViewOfFile
wird eine Datei (mapping) und können Sie behandeln Sie wie eine Speicher-Puffer — gibt es einevoid*
.