将FILE句柄重定向到char-buffer

时间:2013-10-11 11:02:39

标签: c++ file-io

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

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

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

2 个答案:

答案 0 :(得分: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()“欺骗”数据流入您控制的缓冲区,但即使这样也存在潜在问题,例如:如果图书馆在文件内搜索,它将无效。

那么,也许你可以在一些临时/临时文件系统上写一个文件并完成它?或者使用Windows以外的平台?或者使用一些“RAM磁盘”软件。

答案 1 :(得分:2)

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