内存中的文件*(没有磁盘访问)

时间:2017-04-13 23:42:05

标签: c fread stdio

我们有接受文件*(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()无法读取任何内容......有什么建议吗?

4 个答案:

答案 0 :(得分:1)

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

它依次尝试以下实现:

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

当没有其他方法可用时,fmem 回退到 tmpfile()

答案 1 :(得分:0)

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

fopen() function

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

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

答案 2 :(得分:0)

对于我们的具体案例,我们发现了CImg插件正在做的事情。

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

的有效替代品

答案 3 :(得分:0)

您可以使用POSIX-2008函数fmemopen()open_memstream():第一个函数将内存数据传递到您的库中非常有用,第二个函数可用于从库中获取数据进入一个内存缓冲区,由set_value分配,以适应数据的实际大小。