内存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()不能读什么?有什么建议?
对于我们的具体情况,我们发现CImg插件做的事情。
至于原始问题中的示例 - 至少MSVC运行时会将写入内容刷新到磁盘本身。因此,这不是一个有效的替换为fmemopen()
可能是因为你 “WB”(只写),而不是 “WB +” 打开(读+写)
为了进一步帮助,您可以#包括errno.h中,并打印出错误代码和字符串。
printf("errno: %d, error:'%s'\n", errno, strerror(errno));
谢谢!这帮助我们读取数据,但仍然会将数据刷新到磁盘。在我们的例子中,RAM驱动器可能是解决方案 – Victor
@Victor查看snprintf的C运行时间源。 IIRC,它通过内存缓冲区执行伪造的FILE。没有更多的窗口框我会找到更好的参考。 –
您可以使用POSIX-2008功能fmemopen()
和open_memstream()
:第一种是有用的传球在内存中的数据到库中,第二个是获取有用将数据从库中移出到内存缓冲区中,该缓冲区将由open_memstream()
分配以适合数据的实际大小。
为什么用C++标记?这看起来像C. – Dai
有没有使用内存映射文件的可能性? – user3344003
'fp'被打开为只写。 – aschepler