6

我正在编写一个为用户生成格式化文件的程序,但它不仅生成格式化文件,它还做更多事情。

我想将单个二进制文件分发给最终用户,当用户运行程序时,它将为用户生成带有适当数据的 xml 文件。

为了实现这一点,我想将文件内容提供给在代码中编译的 char 数组变量。当用户运行程序时,我会写出char文件为用户生成一个xml文件。

   char*  buffers = "a xml format file contents, \
                     this represent many block text \
                     from a file,...";

我有两个问题。

Q1。对于如何将我的文件内容编译成二进制文件,即作为一个二进制文件分发,您还有其他想法吗?

Q2。如上所述,这甚至是一个好主意吗?

4

6 回答 6

9

您所描述的是迄今为止 C/C++ 的规范。对于大量文本数据,或任意二进制数据(或实际上任何可以存储在文件中的数据——例如 zip 文件),您可以将数据写入文件,将其直接链接到您的程序中。

可以在这样的网站上找到一个示例

于 2013-07-03T04:51:57.237 回答
7

除非您有自己的原因,否则我建议您使用另一个文件来包含数据,而不是将数据放入二进制文件中。我不知道将字符串放入二进制文件的其他可移植方法,但您的解决方案似乎还可以。

但是,注意\在行尾使用形成多行的字符串,缩进要注意,因为它们是从下一行的开始拼接起来的:</p>

char*  buffers = "a xml format file contents, \
this represent many block text \
from a file,...";

或者您可以使用另一种形式:

char *buffers = 
         "a xml format file contents,"
         "this represent many block text"
         "from a file,...";
于 2013-07-03T05:06:23.090 回答
3

可能,我的回答为主题启动器提供了很多冗余信息,但这是我所知道的:

  1. 嵌入源代码:普通的 C/C++ 解决方案这是一个坏主意,因为每次您想要更改内容时,您都需要:

    • 重新编译
    • 重新链接

    如果构建时间不是问题(如果您的应用程序很小),那么只有您的内容很少更改或从不更改是可以接受的。

  2. 嵌入二进制:在可执行文件中嵌入内容的更灵活的解决方案很少存在,但它们都不是跨平台的(你没有说明你的目标平台):

    您不需要重新编译 C++ 文件,只需重新链接。

  3. 应用程序虚拟化:有一些特殊的实用程序可以将所有应用程序资源包装到单个可执行文件中,类似于在虚拟机上运行它。

    我只知道适用于 Windows 的此类实用程序(ThinAppBoxedApp),但其他操作系统甚至跨平台操作系统也可能有此类实用程序。

  4. 考虑以某种形式的安装程序分发您的应用程序:启动安装程序时,它会创建所有资源并解压缩可执行文件。它类似于通过主要可执行文件生成整个东西。这可以是大而复杂的包,甚至是简单的自解压存档。

当然,选择取决于您正在创建什么样的应用程序,您的目标听觉对象是什么,您将如何将软件包发送给最终用户等。如果它是一个游戏并且您针对儿童,它与 C++ 的 Unix 控制台实用程序不同编码员=)

于 2013-07-03T06:50:33.960 回答
1

这取决于。如果您正在做一些没有国际化观点的小型 unix 风格实用程序,那么它可能没问题。你不想用一个没人会碰过的文件来膨胀一个分配器。

但总的来说,这是一种不好的做法,因为最终有人可能想要修改这些数据,而他或她将不得不重建整个事物来修复错字或其他任何东西。

这个决定真的取决于你。

如果您只想将您的分布保持在一个整体中,您可能还会发现这个线程很有趣:将数据存储在可执行文件中

于 2013-07-03T05:29:47.520 回答
0

为什么不使用附加配置文件分发您的应用程序?例如,将您的应用程序可执行文件和配置文件打包在一起。

如果您确实想将其制成一个文件,请尝试将您的配置文件作为资源嵌入到可执行文件中。

于 2013-07-03T05:18:52.900 回答
0

我认为它更像是一个操作系统而不是 C/C++ 问题。您可以将文本添加到二进制/程序的资源部分。在 Windows 程序中,HTML、图形甚至电影文件通常被编译成资源,这些资源构成最终二进制文件的一部分。

这对于将来可能翻译成另一种语言很方便,而且您可以修改二进制文件的资源部分而无需重新编译代码。

于 2013-07-03T05:27:30.370 回答