2017-07-18 1 views
0

Ich habe ein Stück Code ein FILE* file mit fwrite mit:mit einigem malloc-ed Speicher Virtualisieren fopen stattdessen eine Datei mit

test = fwrite(&object,sizeof(object),1,file); 

Ich mag einige interne Datenstruktur mit einer Indexstruktur serialisiert (so Ich verwende weder Google's Protobuf noch Cap'n Proto, da dies eine benutzerdefinierte Datenstruktur mit bestimmten Indizierungsanforderungen ist. Nun möchte ich in meinem Projekt Google Test verwenden, um die Serialisierung zu testen, um zu überprüfen, ob sie serialisiert wurde, und dass sie deserialisiert und leicht abgerufen werden kann. In der Testphase möchte ich ein FILE * -Objekt fwrite schreiben, das keine Datei ist, sondern einen Handler zu einem zugewiesenen Hauptspeicher, so daß keine Datei erzeugt wird und ich den Hauptspeicher direkt nach den Ergebnissen von die Serialisierung. Ist es möglich, die FILE* zu virtualisieren und direkt in den Hauptspeicher zu schreiben? Ich würde gerne aus Performance-Gründen schreiben, um Datenstrukturen schreiben zu können, ohne gezwungen zu sein, zwei verschiedene Methoden für die Serialisierung zu schreiben (Manchmal schreibe ich im laufenden Betrieb ohne weitere Speicherbelegung für die Transcodierung). Danke im Voraus.

+0

'fwrite' nicht wirklich Serialisierung (und es wird nicht nicht-POD-Objekte serialisiert). Wenn Sie in den Speicher schreiben möchten, verwenden Sie einfach 'memcpy', aber nur für POD-Objekte. –

+0

Alles ist ein POD-Objekt in meiner Struktur, und ich möchte den Code nicht als fwrite und memcpy umschreiben. – jackb

+1

In diesem Fall könnten Sie einen Layer erstellen, der entweder in eine Datei oder in den Speicher (Memfile) schreibt und diese für alle Ihre Programme verwendet. Das wäre eine nette Idee. –

Antwort

0

Eine Möglichkeit besteht darin, eine dynamische Bibliothek mit all diesen fopen/fwrite-Funktionen zu erstellen (die etwas für Ihren magischen Dateinamen tun würden und ansonsten auf die ursprünglichen zurückgreifen würden) und sie mit LD_PRELOAD laden. Um auf die Originale zurückzukommen, lösen Sie sie mit "dlsym" und RTLD_NEXT.

Eine andere Möglichkeit besteht darin, einen speziellen Header am Anfang der Bibliothek/des Tests einzufügen, der eine Anweisung wie "#define fopen my_fopen" enthalten würde. Innerhalb der Datei mit der Implementierung von "my_fopen" müssen Sie "#undef fopen" einfügen, bevor Sie original "stdio.h" einfügen. Dieser Ansatz funktioniert nur für Ihre Quellcodedateien, die den Header enthalten, aber nicht die Funktionen für die binären Bibliotheken, die Sie verknüpfen.

Verwandte Themen