【问题标题】:Embedding a file into a program将文件嵌入到程序中
【发布时间】:2011-01-18 04:05:13
【问题描述】:

我想在程序中嵌入一个文件。如果没有提供,它将用于默认配置文件。我意识到我可以只使用默认值,但我想提取文件并将其放在磁盘上以便可以对其进行修改。

【问题讨论】:

标签: c++ file embedded-resource


【解决方案1】:

嵌入是指在没有文件的情况下分发程序吗?

然后您可以将其转换为构建工具链中的配置初始化代码。添加一个 makefile 步骤(或您正在使用的任何工具) - 一个将此 .cfg 文件转换为初始化配置数据结构的 C++ 代码文件的脚本。这样,您只需修改 .cfg 文件,重新构建项目,并在其中反映新值。

顺便说一句,在 Windows 上,您可能会幸运地将数据嵌入到 resource file

【讨论】:

  • 嗯,我真正想做的是让我的程序能够从引擎中生成有效文件,例如 .png 文件。然后我希望能够将这些文件生成到磁盘上,有点像 zip 文件。
【解决方案2】:

您可以做的一件常见事情是将文件数据表示为静态字节数组:

// In a header file:
extern const char file_data[];
extern const size_t file_data_size;

// In a source file:
const char file_data[] = {0x41, 0x42, ... };  // etc.
const size_t file_data_size = sizeof(file_data);

然后,文件数据将只是编译到可执行文件中的全局字节数组,您可以在任何地方引用。您必须重写文件处理代码才能处理原始字节数组,或者使用 fmemopen(3) 之类的东西从数据中打开伪文件句柄并将其传递给文件处理代码。

当然,要将数据转换为这种形式,您需要使用某种预处理步骤将文件转换为编译器可以接受的字节数组。一个 makefile 会很好。

【讨论】:

  • 周围有一些程序可以为您将数据文件转换为一对 C 文件(标题和正文)。可能还有一些程序可以将数据直接打包到链接器目标文件中,但显然这是一种不太便携的技巧。
  • 虽然此解决方案适用于小文件,但我在 Visual Studio 中经历了巨大的编译时间(使用 4kb 文件)。如果您打开包含数组的文件,Visual Studio 也会开始滞后....
【解决方案3】:

嵌入式数据通常被称为“资源”。 C++ 不提供本机支持,但可以以几乎所有可执行文件格式对其进行管理。尝试为 c++ 搜索资源管理器。

【讨论】:

    【解决方案4】:

    如果是任何 Unix,请使用 mmap(2) 将文件映射到进程内存中。 Windows 也有类似的东西,但我从来没有玩过。

    【讨论】:

    • 我在回答左边的 :)
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2012-06-01
    • 2014-02-20
    • 2010-11-30
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多