将文件句柄重定向到字符缓冲区

Redirect FILE handle to char-buffer

本文关键字:字符 缓冲区 重定向 文件句柄      更新时间:2023-10-16

我正在使用允许在两种文件格式AB之间进行转换的第三方库。我想使用此库加载格式 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。 以下是您可以尝试的概述:

  • 打开非持久内存映射文件。
  • 使用 _open_osfhandle 将 HANDLE 转换为 int 文件描述符。
  • 使用 _fdopen 将 int 文件描述符转换为 FILE*。
  • 祈祷好运。 我还没有测试过这些。

我发现这个参考在将各个部分放在一起很有用:http://www.codeproject.com/Articles/1044/A-Handy-Guide-To-Handling-Handles

编辑2:看起来CreateFileMapping()和_open_osfhandle()可能彼此不兼容 - 你至少是第三个尝试它的人:

  • https://groups.google.com/forum/#!topic/comp.os.ms-windows.programmer.win32/NTGL3h7L1LY
  • http://www.progtown.com/topic178214-createfilemapping-and-file.html

因此,您可以尝试最后一个链接的建议,即使用setvbuf()"欺骗"数据流向您控制的缓冲区,但即使这样也存在潜在问题,例如,如果库在 FILE* 中查找,它将不起作用。

那么,也许您可以只写入某个临时/暂存文件系统上的文件并完成它? 或者使用Windows以外的平台? 或者使用一些"RAM磁盘"软件。

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