gpt4 book ai didi

c++ - 在可以使用 fopen 访问的 exe 中嵌入文本文件

转载 作者:太空狗 更新时间:2023-10-29 23:08:57 26 4
gpt4 key购买 nike

我想在我的程序中嵌入一个包含一些数据的文本文件。我们称它为“data.txt”。

这个文本文件通常加载了一个函数,该函数需要文本文件的文件名作为输入,并最终使用 fopen() 调用打开......一些东西到

FILE* name = fopen("data.txt");

我真的无法更改此功能,我希望例程每次运行时都打开同一个文件。我见过有人询问有关将文件作为 header 嵌入的问题,但似乎我无法在嵌入 header 的文件上调用 fopen()。

所以我的问题是:有没有办法将文本文件作为可调用文件/变量嵌入到 fopen()?

我正在使用 VS2008。

最佳答案

是和否。最简单的方法是将文本文件的内容转换为初始化数组。

char data_txt[] = {
'd','a','t','a',' ','g','o','e','s',' ','h','e','r','e', //....
};

这种转换很容易用一个小的 perl 脚本甚至一个小的 C 程序完成。然后编译生成的模块并将其链接到您的程序中。

使用 Makefile 使这更容易管理的一个老技巧是让脚本将其数据转换为初始化程序的 body 并将其写入一个文件,而没有周围的变量声明,甚至没有大括号。如果将 data.txt 转换为 data.inc,那么它的用法如下:

char data_txt[] = {
#include "data.inc"
};

更新

在许多平台上,可以将任意数据附加到可执行文件本身。诀窍是在运行时找到它。在可能的平台上,将有指示可执行镜像长度的可执行文件的文件头信息。在您打开可执行文件进行读取后,它可用于计算与 fseek() 一起使用的偏移量。这很难以可移植的方式做到,因为甚至可能无法以可移植的方式在运行时获知可执行镜像的实际文件名。 (提示,argv[0] 不需要指向实际程序。)

如果你无法避免调用fopen(),那么你仍然可以使用这个技巧来保留一份data.txt的内容,并把它在运行时回到文件中。你甚至可以很聪明,只在文件丢失时写入文件....

如果您可以放弃对 fopen() 的调用,但仍然需要一个指向数据的 FILE *,那么这很可能if 您愿意随意使用 C 运行时库的 stdio 实现。在 GNU 版本的 libc 中,像 sprintf()sscanf() 这样的函数实际上是通过创建一个“足够真实”的 FILE * 来实现的可以传递给通用实现(vfprintf()vfscanf(),IIRC)。伪造的 FILE 被标记为已缓冲,并将其缓冲区指向用户的缓冲区。一些魔术用于确保 stdio 的其余部分不会做任何愚蠢的事情。

关于c++ - 在可以使用 fopen 访问的 exe 中嵌入文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com