C ++文件不写入磁盘
我正在使用一个库,它有很多写入FILE
函数,但是没有一个函数可以方便地将相同的数据转储到内存中的对象。 有什么办法来创build一个FILE
对象(或覆盖它),而不是写入磁盘的数据存储在内存中 – 我想避免一次又一次打开/写入/读取文件的性能打击。
更新:根据Rob的build议,尝试stringstream:
ss.put(c); std::string myval = ss.str(); printf("Value: %s\n after writing: %i length %lu\n",myval.c_str(),c, myval.length());
但是,现在试图从stringstream中获取数据(二进制),我坚持 – 我如何获取我已经添加的二进制数据?
除了已经提到的GNU的fmemopen()
,在POSIX中被称为open_memstream ,类似的解决scheme可以通过将 mmap()
(使用MAP_ANONYMOUS)或任何其他特定于OS的函数返回给内存块来获得,而fdopen()
。
编辑:这是错的,mmap不会创build一个文件描述符。
GNU libc有,例如, fmemopen
,它会给你一个写入内存的FILE *
。 在你的Linux系统上试试man fmemopen
来获取细节。
我怀疑(但不知道) fmemopen
是一个包装器,编排fdopen
提到的mmap
/ fdopen
方法。
如果您在Mac OS X或iOS上,则无法访问fmemopen。 我已经在这里开源了一个解决scheme:
如果您可以select修改库,则可以使用C ++stream而不是C FILEstream。
如果你的旧库函数看起来像这样:
void SomeFun(int this, int that, FILE* logger) { ... other code ... fprintf(logger, "%d, %d\n", this, that); fputs("Warning Message!", logger); char c = '\n'; fputc(c, logger); }
你可以用下面的代码replace它:
void SomeFun(int this, int that, std::ostream& logger) { ... other code ... logger << this << ", " << that << "\n"; // or: logger << boost::format("%d %d\n") %this %that; logger << "Warning Message!"; char c = '\n'; logger.put(c); // or: logger << c; }
然后,在您的非库代码中,执行如下操作:
#include <sstream> std::stringstream logStream; SomeFun(42, 56, logStream); DisplayCStringOnGui(logStream.str().c_str());
考虑安装一个tmpfs
并让应用程序写入它。 当然这只是* nix而已。