2

我正在使用允许在两种文件格式AB之间进行转换的第三方库。我想使用这个库来加载格式A的文件并将其转换为格式B,但我只需要在内存中转换的表示。所以我想在不实际将目标格式的文件保存到磁盘的情况下进行转换,而是获取unsigned char*缓冲区或类似的东西。不幸的是,图书馆唯一的转换功能是形式

void saveAsB(A& a, std::FILE *const file);

我能做些什么?有没有办法将句柄上执行的写操作重定向到某个缓冲区?

4

2 回答 2

6

如果您的平台支持,请使用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 盘”软件。

于 2013-10-11T11:13:46.917 回答
2

如果您可以依赖 POSIX 可用,请使用fmemopen().

于 2013-10-11T11:06:26.683 回答