C++ C++;不写入磁盘的文件

C++ C++;不写入磁盘的文件,c++,ios,file-io,memorystream,C++,Ios,File Io,Memorystream,我正在使用一个库,它有相当多的函数可以写入文件,但没有一个函数可以方便地将相同的数据转储到内存中的对象。有没有办法创建一个文件对象(或重写它),将数据存储在内存中而不是写入磁盘——我希望避免反复打开/写入/读取文件的性能问题 更新:根据Rob的建议,尝试stringstream: ss.put(c); std::string myval = ss.str(); printf("Value: %s\n after writing: %i length %lu\n",myval.c_str(),

我正在使用一个库,它有相当多的函数可以写入
文件
,但没有一个函数可以方便地将相同的数据转储到内存中的对象。有没有办法创建一个
文件
对象(或重写它),将数据存储在内存中而不是写入磁盘——我希望避免反复打开/写入/读取文件的性能问题

更新:根据Rob的建议,尝试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 libc有,例如,
fmemopen
,它将为您提供一个写入内存的
文件*
。有关详细信息,请在Linux系统上尝试
man-fmemopen


我怀疑(但不确定)fmemopen是一个包装器,它协调了@Cubbi提到的
mmap
/
fdopen
方法。

考虑挂载一个应用程序并将其写入。当然,这只是*nix。

除了前面提到的GNU的
fmemopen()
(在POSIX中称为)之外,结合
mmap()
(使用MAP\u ANONYMOUS)或将文件描述符返回内存块的任何其他操作系统特定函数,以及
fdopen()
,可以获得类似的解决方案


<>编辑:这是错误的,MMAP没有创建文件描述符。

< P>如果你有修改库的选项,你可以使用C++流代替C文件流。 如果旧库函数如下所示:

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;
}
void SomeFun(int this,int that,std::ostream&logger){
…其他代码。。。

logger如果您使用的是Mac OS X或iOS,则无法访问fmemopen。我在这里公开了一个解决方案:


在C语言中似乎是一个可移植的
fmemopen
。它提供给你可以写入的文件,当你完成后,你会得到一个
void*
,它指向你的数据所在的内存。

我提到,这只是为了完整性。
stringstream
无法解决OP的问题,因为他与
文件
有关。如果他可以修改他的库,他可以使用
stringstream
@Rob-我的目标是避免修改库的源代码(避免升级时发生冲突等),但我有这个选择。我想我可能会走这条路,因为其他解决方案现在看起来比我的C技能更低级。基本上,我需要替换或扩充一个现在正在使用
fputc
——我将使用
put
from
stringstream
的函数,对吗?不要害怕使用
fmemopen
open_memstream
。它们看起来很适合你。但是,如果你真的想使用
stringstream
,请看我的答案。这两种功能在iOS上都不可用,所以我会被困在做
mmap
之类的事情上——还有一件事我还不太舒服!你的回答是面试的完美问题!回答得很好。不过,我有限的C语言技能让我对深入到这一步非常谨慎——请参阅我在原始帖子上对Rob的评论。可能只需对原始库进行一点修改就可以逃脱。您是如何从mmap中获得可用于fdopen的文件描述符的?我正在尝试获取一个指向内存中一个mmap d位置的文件指针,但该位置不存在“没有备份文件。@如果你是对的,
mmap
不会创建文件描述符。我写这篇文章时考虑了
shm\u-open
,但是
shm\u-open
的文件描述符在
fdopen
中是不允许的。谢谢你指出错误!编辑:将代码放在原始问题中以获得更好的格式设置我已经知道了。”从根本上说,这是不起作用的。我现在遇到的问题是把数据拿出来——它是二进制数据。现在,我有:
ss.put(c);std::string myval=ss.str();printf(“写入后的值:%s\n:%I length%lu\n”,myval.c_str(),c,myval.length());
length()call给了我一个精确增加的值,但我一直在尝试获取数据——c_str给了我一个长度为4的
const char*
——如果库返回的数据是二进制的(也就是说,其中可能嵌入了
'\0'
字符),则缺少大部分二进制数据,则您将无法使用
printf(“%s”,…)
访问它。您只是试图不显示该数据?还是需要将其传递给另一个函数?您可以像这样逐字节访问数据:
myval[i]
。或者您可以像这样传递指向数据的指针:
MyFunc(myval.data(),myval.length())
#include <sstream>    
std::stringstream logStream;
SomeFun(42, 56, logStream);
DisplayCStringOnGui(logStream.str().c_str());