内存中文件*(无磁盘访问)
in-memory FILE* (without disk access)
我们有接受 FILE* (CImg) 的库。出于性能原因,我们希望在不访问磁盘的情况下处理内存中的数据。目标平台是 windows,遗憾的是它不支持 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!
Final fread() 无法读取任何内容...有什么建议吗?
可能是因为您使用 "wb"(只写)而不是 "wb+"(读 + 写)打开
为了进一步提供帮助,您可以#include errno.h 并打印出错误代码和字符串。
printf( "errno: %d, error:'%s'\n", errno, strerror( errno ) );
对于我们的具体案例,我们发现 CImg 插件在做这件事。
作为原始问题中的示例 - 至少 MSVC 运行时会将写入的内容刷新到磁盘本身。所以它不是 fmemopen()
的有效替代品
https://github.com/Snaipe/fmem 是内存文件
的不同platform/version 特定实现的包装器
它按顺序尝试以下实现:
- open_memstream.
- fopencookie,具有不断增长的动态缓冲区。
- funopen,动态缓冲区不断增加。
- WinAPI 临时内存备份文件。
当没有其他方法可用时,fmem 回退到 tmpfile()
我们有接受 FILE* (CImg) 的库。出于性能原因,我们希望在不访问磁盘的情况下处理内存中的数据。目标平台是 windows,遗憾的是它不支持 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!
Final fread() 无法读取任何内容...有什么建议吗?
可能是因为您使用 "wb"(只写)而不是 "wb+"(读 + 写)打开
为了进一步提供帮助,您可以#include errno.h 并打印出错误代码和字符串。
printf( "errno: %d, error:'%s'\n", errno, strerror( errno ) );
对于我们的具体案例,我们发现 CImg 插件在做这件事。
作为原始问题中的示例 - 至少 MSVC 运行时会将写入的内容刷新到磁盘本身。所以它不是 fmemopen()
的有效替代品https://github.com/Snaipe/fmem 是内存文件
的不同platform/version 特定实现的包装器它按顺序尝试以下实现:
- open_memstream.
- fopencookie,具有不断增长的动态缓冲区。
- funopen,动态缓冲区不断增加。
- WinAPI 临时内存备份文件。
当没有其他方法可用时,fmem 回退到 tmpfile()