8
votes

Fichier c ++ sans écrire sur le disque

J'utilise une bibliothèque qui dispose de nombreuses fonctions qui écrivent à un fichier code> mais aucun qui semble vider facilement les mêmes données à un objet en mémoire. Y a-t-il un moyen de créer un fichier code> objet code> (ou le remplacer) qui stocke les données en mémoire au lieu d'écrire sur le disque - je voudrais éviter le succès de la performance d'ouverture / d'écriture / lecture de fichiers encore et encore.

Mise à jour: Strong> Par Suggestion de Rob, essayant Stringstream: P>

ss.put(c);

std::string myval = ss.str();

printf("Value: %s\n after writing: %i length %lu\n",myval.c_str(),c, myval.length());


6 Réponses :


5
votes

Le GNU libc a, par exemple, fmemopen qui vous donnera un fichier * qui écrit à la mémoire. Essayez man fmemopen sur votre système Linux pour plus de détails.

Je soupçonne (mais je ne sais pas à coup sûr) que fmemopen est un wrapper qui orchestre le mmap / fdopen approche mentionnée par @Cubbi .


0 commentaires

0
votes

envisager de monter un TMPFS et demandez-y à l'application. . Bien sûr, cela est * Nix uniquement.


0 commentaires

10
votes

à côté de la FMEMOPen () , qui est connu dans POSIX comme open_memMStream , une solution similaire peut être obtenue combinant mmap () (à l'aide de map_anonymous) ou de toute autre fonction spécifique au système d'exploitation qui renvoie un descripteur de fichier à un bloc de mémoire, et fdopen () .

EDIT: C'était faux, MMAP ne crée pas de descripteur de fichier.


3 commentaires

Très bonne réponse. Mes compétences limitées C me permettent de me méfier dans cette profonde, mais à voir mon commentaire à voler sur le post original. Peut être capable de s'en sortir avec une petite modification de la bibliothèque d'origine.


Comment avez-vous reçu un descripteur de fichier de MmeMA pouvant être utilisé avec Fdopen? J'essaie d'obtenir un pointeur de fichier sur un emplacement de MmeAp'd en mémoire qui n'a pas de fichier de support.


@feather, vous avez raison, mmap ne crée pas de descripteur de fichier. Je pensais shm_open lorsque vous écrivez cela, mais SHM_OPEN S n'est autorisé dans Fdopen . Merci d'avoir souligné l'erreur!



1
votes

Si vous avez la possibilité de modifier votre bibliothèque, vous pouvez utiliser des flux C ++ au lieu des flux de fichiers C.

Si votre fonction Old Bibliothèque ressemblait à ceci: P>

#include <sstream>    
std::stringstream logStream;
SomeFun(42, 56, logStream);
DisplayCStringOnGui(logStream.str().c_str());


2 commentaires

Modifier: Mettez le code dans la question originale pour une meilleure mise en forme que j'ai travaillé, jusqu'à un point de base. Le problème que je frappe maintenant est de trouver les données - c'est des données binaires. En ce moment, j'ai: Ss.put (c); std :: string myval = Ss.str (); printf ("Valeur:% s \ N après écriture:% I Longueur% LU \ N", myval.c_str (), c, myval.length ()); L'appel de la longueur () me donne une valeur le augmente avec précision, mais je suis coincé à essayer d'obtenir les données - le C_STR me donne un Const Char * avec une longueur de 4 - la plupart des données binaires


Si les données renvoyées par la bibliothèque sont binaires (c'est-à-dire potentiellement '\ 0' caractères intégrés), vous ne pourrez pas utiliser printf ("% s" , ...) pour y accéder. Essayez-vous simplement T Afficher ces données? Ou avez-vous besoin de le transmettre à une autre fonction? Vous pouvez accéder à l'octet-octet-byte comme ceci: myval [i] . Ou vous pouvez transmettre un pointeur sur les données telles que ceci: myfunc (myval.data (), myval.length ()) .



2
votes

Si vous êtes sur Mac OS X ou iOS, vous n'avez pas accès à FMEMOPEN. J'ai ouvert une solution ici:

http://jverkoey.github.com/fmemopen/


0 commentaires

0
votes

https://github.com/snaipe/fmem semble être un portable FMEMOPEN in C. Il vous donne un fichier que vous pouvez écrire sur et lorsque vous avez effectué un Void * qui pointe vers la mémoire où vous avez des données.


0 commentaires