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:

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

如果您可以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而已。