内存FILE *(无磁盘访问)

问题描述:

我们有接受FILE *(CImg)的库。出于性能原因,我们希望处理已经在内存中的数据而不访问磁盘。目标平台是一种遗憾的是不支持fmemopen窗口(和funopen)内存FILE *(无磁盘访问)

char* buf = new char[sz]; 

FILE *fp = fopen("C:\\test.dat", "wb"); 
int r = setvbuf(fp, buf, _IOFBF, sz); 

r = fwrite(src_buf, 1, sz, fp);  // Here r contains right size 


fseek(fp, 0, SEEK_END); 
size_t sz2 = ftell(fp);    // sz2 contains right size as well 
rewind(fp); 

// Test (something like this actually is somewhere deep inside library) 
char* read_buf = new char[sz]; 
r = fread(read_buf, 1, sz, fp);  // Zero! 

最终FREAD()不能读什么?有什么建议?

+1

为什么用C++标记?这看起来像C. – Dai

+0

有没有使用内存映射文件的可能性? – user3344003

+1

'fp'被打开为只写。 – aschepler

对于我们的具体情况,我们发现CImg插件做的事情。

至于原始问题中的示例 - 至少MSVC运行时会将写入内容刷新到磁盘本身。因此,这不是一个有效的替换为fmemopen()

可能是因为你 “WB”(只写),而不是 “WB +” 打开(读+写)

fopen() function

为了进一步帮助,您可以#包括errno.h中,并打印出错误代码和字符串。

printf("errno: %d, error:'%s'\n", errno, strerror(errno)); 
+0

谢谢!这帮助我们读取数据,但仍然会将数据刷新到磁盘。在我们的例子中,RAM驱动器可能是解决方案 – Victor

+0

@Victor查看snprintf的C运行时间源。 IIRC,它通过内存缓冲区执行伪造的FILE。没有更多的窗口框我会找到更好的参考。 –

您可以使用POSIX-2008功能fmemopen()open_memstream():第一种是有用的传球在内存中的数据到库中,第二个是获取有用将数据从库中移出到内存缓冲区中,该缓冲区将由open_memstream()分配以适合数据的实际大小。