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. 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 :
Le GNU libc a, par exemple, Je soupçonne (mais je ne sais pas à coup sûr) que fmemopen code> qui vous donnera un fichier * code> qui écrit à la mémoire. Essayez man fmemopen code> sur votre système Linux pour plus de détails. P>
fmemopen code> est un wrapper qui orchestre le mmap code> / fdopen code> approche mentionnée par @Cubbi . P>
envisager de monter un TMPFS code> et demandez-y à l'application. . Bien sûr, cela est * Nix uniquement. P>
à côté de la EDIT: C'était faux, MMAP ne crée pas de descripteur de fichier. P> FMEMOPen () CODE>, qui est connu dans POSIX comme open_memMStream , une solution similaire peut être obtenue combinant mmap () code> (à 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 () code>. frappe> p>
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 code> ne crée pas de descripteur de fichier. Je pensais shm_open code> lorsque vous écrivez cela, mais SHM_OPEN CODE> S n'est autorisé dans Fdopen code>. Merci d'avoir souligné l'erreur!
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());
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 ()); code> 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 * Code> 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' code> caractères intégrés), vous ne pourrez pas utiliser printf ("% s" , ...) code> 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] code>. Ou vous pouvez transmettre un pointeur sur les données telles que ceci: myfunc (myval.data (), myval.length ()) code>.
Si vous êtes sur Mac OS X ou iOS, vous n'avez pas accès à FMEMOPEN. J'ai ouvert une solution ici: p>
https://github.com/snaipe/fmem semble être un portable FMEMOPEN code> in C. Il vous donne un fichier que vous pouvez écrire sur et lorsque vous avez effectué un Void * code> qui pointe vers la mémoire où vous avez des données. P>
Seulement pour l'exhaustivité, je parle
std :: stringstream code> a >.Stringstream code> ne résoudra pas le problème de l'OP, car il est lié au fichiercode>. S'il pouvait modifier sa bibliothèque, il pourrait utiliserstringstream code>.@ROB - Mon objectif était d'éviter de modifier la source de la bibliothèque (éviter les conflits lors de la mise à niveau, etc.), mais j'ai l'option. Je pense que je peux prendre ce chemin, car les autres solutions semblent plus basse que mes compétences en C désormais. Fondamentalement, j'ai besoin de remplacer ou d'augmenter une fonction qui utilise actuellement
fputc code> - je vais utilisermettre code> à partir destringstream code> à la place, à droite ?N'ayez pas peur d'utiliser
fmemopen code> ouopen_memMStream code>. Ils ressemblent à des solutions parfaites pour vous. Mais si vous voulez utiliserstringstream code>, voir ma réponse.Ni la fonction n'est disponible pour moi sur iOS, donc je serais coincé à faire
MMAP code> Stuff - Une autre chose que je ne suis pas encore à l'aise avec!Votre est une question parfaite pour une interview!