【问题标题】:Redirect FILE handle to char-buffer将文件句柄重定向到字符缓冲区
【发布时间】:2013-10-19 10:35:30
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ file-io


【解决方案1】:

如果您的平台支持,请使用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 以外的平台?或者使用一些“内存盘”软件。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2011-02-06
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多