C语言 内存中文件*(无磁盘访问)



我们有接受FILE*(CImg(的库。出于性能原因,我们希望在不访问磁盘的情况下处理内存中已有的数据。目标平台是不幸的是不支持fmemopen(和funopen(的窗口

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((无法读取任何内容...有什么建议吗?

可能是因为您使用"wb"(只写(而不是"wb+"(读取 + 写入(打开

fopen(( 函数

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

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

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

作为原始问题中的示例 - 至少 MSVC 运行时将写入的内容刷新到磁盘本身。所以它不是 fmemopen(( 的有效替代品

https://github.com/Snaipe/fmem 是内存中文件的不同平台/版本特定实现的包装器

它按顺序尝试以下实现:

  • open_memstream。
  • fopencookie,具有不断增长的动态缓冲区。
  • Funopen,具有不断增长的动态缓冲区。
  • WinAPI 临时内存支持的文件。

当没有其他平均值可用时,fmem 回退到 tmpfile((

最新更新