【问题标题】:FILE IO to InMemory IO文件 IO 到内存 IO
【发布时间】:2014-08-17 13:09:21
【问题描述】:

我有一个旧的 C 库,它接受一个文件,处理文件有效负载并将处理后的有效负载写入输出文件。库中的函数与 FILE 紧密耦合,即它将 FILE 句柄传递给函数,函数执行文件 IO 以检索必要的数据。

我想修改这个库,使其可以在内存数据中使用(无文件 IO)。即传递一个二进制数组并返回二进制数组。

我有两个解决方案

  1. 实现一个 InMemory File 模块(将所有操作植入为 C 文件)并使用 typedef 或 #define 用新实现覆盖默认文件操作
  2. 将二进制数组传递给库的所有函数,并从中检索必要的数据。

哪个更好或任何其他更好的方法来解决问题

【问题讨论】:

标签: c++ c file-io static-libraries


【解决方案1】:

如果任何其他代码依赖于遗留代码,我建议不要更改它。

如果您正在构建一个有点 POSIX 兼容的平台,您可以使用 fmemopen http://pubs.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html

对于 Windows,这可能会有所帮助 C - create file in memory

【讨论】:

  • 感谢 Zelix。我正在使用Linux。我认为“fmemopen”对我有用。我会试用并分享结果。
  • 这对于库的某些部分非常有用。问题发生在使用文件描述符而不是 FILE 指针的地方。不幸的是,fmemopen FILE 句柄没有文件描述符(即 fileno() 返回 -1)。有什么建议吗?
【解决方案2】:

我不知道更改遗留代码的确切目的是什么。我理解的问题是读写造成的开销。但是有很多方法可以解决开销问题:

  1. 如前所述,您可以使用fmemopen
  2. 您也可以使用mmap 来表示普通的read/write 应该没什么区别;无论哪种方式,一切都通过文件系统缓存/缓冲区发生。
  3. 您还可以使用tmpfs 将内存用作(临时)文件,也称为RAMDisk 作为存储。由于文件在本质上已经是临时文件,因此文件很容易被洗掉
  4. 另一种解决方案 - 您可以使用内存数据库(TimesTen 示例)

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 2019-03-28
    • 2015-07-09
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多