我正在使用允许在两种文件格式A和B之间进行转换的第三方库。我想使用这个库来加载格式A的文件并将其转换为格式B,但我只需要在内存中转换的表示。所以我想在不实际将目标格式的文件保存到磁盘的情况下进行转换,而是获取unsigned char*
缓冲区或类似的东西。不幸的是,图书馆唯一的转换功能是形式
void saveAsB(A& a, std::FILE *const file);
我能做些什么?有没有办法将句柄上执行的写操作重定向到某个缓冲区?
如果您的平台支持,请使用open_memstream(3)。这将在 Linux 和 BSD 系统上可用,对于您的用例,它可能比 fmemopen() 更好,因为 open_memstream() 动态分配输出缓冲区,而不是您必须提前知道最大大小。
如果您的平台没有这些功能,您总是可以使用“RAM 磁盘”方法,这在 Linux 上又将写入一个“文件”,/dev/shm/
该文件实际上永远不会到达任何磁盘,而是存储在内存中。
编辑:好的,所以你说你使用的是 Windows。以下是您可以尝试的概述:
我发现此参考资料有助于将各个部分组合在一起: http: //www.codeproject.com/Articles/1044/A-Handy-Guide-To-Handling-Handles
编辑 2:看起来 CreateFileMapping() 和 _open_osfhandle() 可能彼此不兼容——您至少是第三个尝试它的人:
因此,您可以尝试最后一个链接的建议,即setvbuf()
用来“欺骗”数据流入您控制的缓冲区,但即使这样也有潜在的问题,例如,如果库在 FILE* 中查找,它将无法工作.
那么,也许您可以只写入某个临时/临时文件系统上的文件并完成它?还是使用 Windows 以外的平台?或者使用一些“RAM 盘”软件。
如果您可以依赖 POSIX 可用,请使用fmemopen()
.