我正在使用一个具有相当多函数的库,这些函数可以写入FILE
但没有一个可以方便地将相同数据转储到内存中的对象。有没有办法创建一个FILE
对象(或覆盖它),将数据存储在内存中而不是写入磁盘 - 我想避免打开/写入/读取文件的性能损失再一次。
更新:,尝试使用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());
但是,现在试图从字符串流中获取数据(二进制)让我陷入困境 - 我如何获取我一直在添加的二进制数据?
答案 0 :(得分:10)
除了已经提到的GNU的fmemopen()
,它在POSIX中称为open_memstream ,可以结合 mmap()
(使用MAP_ANONYMOUS)或任何其他特定于操作系统的方式获得类似的解决方案将文件描述符返回到内存块的函数,fdopen()
。
编辑:这是错误的,mmap不会创建文件描述符。
答案 1 :(得分:5)
GNU libc有例如fmemopen
,它会给你一个写入内存的FILE *
。有关详细信息,请在Linux系统上尝试man fmemopen
。
我怀疑(但不确定)fmemopen
是一个包装程序,用于协调@Cubbi提到的mmap
/ fdopen
方法。
答案 2 :(得分:2)
如果您使用的是Mac OS X或iOS,则无法访问fmemopen。我在这里开源解决方案:
答案 3 :(得分:1)
如果您可以选择修改库,则可以使用C ++流而不是C FILE流。
如果您的旧库函数看起来像这样:
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);
}
您可以用以下代码替换该代码:
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());
答案 4 :(得分:0)
考虑挂载tmpfs
并让应用程序写入它。当然这只是* nix。
答案 5 :(得分:0)
https://github.com/Snaipe/fmem在C语言中似乎是可移植的fmemopen
。它为您提供了可以写入的FILE,完成后您会得到一个void*
,它指向数据所在的内存