将文件句柄重定向到字符缓冲区
Redirect FILE handle to char-buffer
我正在使用允许在两种文件格式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。 以下是您可以尝试的概述:
- 打开非持久内存映射文件。
- 使用 _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()
。
- C++字符*缓冲区的大小
- 将字符缓冲区强制转换为函数指针
- 来自无符号字符缓冲区的虚拟输出
- 如何在C++中将无符号字符缓冲区转换为双精度?
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 将字符缓冲区转换为字符串
- 读取文件时字符缓冲区溢出
- 来自字符缓冲区的恐惧
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"
- C/C++ 从字符缓冲区读取以填充结构
- 具有输入无符号字符缓冲区C++的设备 IoControl
- 如何从字符 * 缓冲区中的位置 y 读取 x 个字符
- 从字符 * 缓冲区到 wchar_t * 缓冲区的内存
- 如何将字符 * 缓冲区转换为无符号的短 int * bufferSh
- 将windows BITMAP转换为PIX(无符号字符缓冲区)
- RAII字符缓冲区
- MFC-传递带有PostMessage From DLL的字符缓冲区
- 如何使用Gstreamer播放原始字符*缓冲区
- 在 Win32 中解析巨大的字符* 缓冲区
- 分配字符缓冲区以保存浮点的文本表示形式