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 fichier
code>. S'il pouvait modifier sa bibliothèque, il pourrait utiliser
stringstream 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 utiliser
mettre code> à partir de
stringstream code> à la place, à droite ?
N'ayez pas peur d'utiliser
fmemopen code> ou
open_memMStream code>. Ils ressemblent à des solutions parfaites pour vous. Mais si vous voulez utiliser
stringstream 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!