将文本文件嵌入到可以使用 fopen 访问的 exe 中

2024-01-04

我想将包含一些数据的文本文件嵌入到我的程序中。 我们称之为“data.txt".

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

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

我无法真正更改此函数,我希望例程每次运行时都打开同一个文件。我见过有人询问如何将文件作为标头嵌入,但似乎我无法对嵌入标头的文件调用 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"
};

Update

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

如果您无法避免致电fopen(),那么你仍然可以使用这个技巧来保留内容的副本data.txt,并在运行时将其放回到文件中。您甚至可以聪明一点,只在文件丢失时才写入该文件......

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文本文件嵌入到可以使用 fopen 访问的 exe 中 的相关文章

随机推荐

  • 如何禁用Tensorflow的多线程?

    我正在使用不支持多线程的模拟器运行 Tensorflow 程序 我在tensorflow core common runtime local device cc第38行将intra op parallelism threads更改为1 但一
  • 为什么我没有从子进程中获取退出状态?

    我有一个正在管理的 Perl 程序 它能够分叉多个进程 最多达到指定的限制 监视它们 并在它们退出时分叉其他进程 再次达到限制 直到要运行的事物列表完成 它工作正常 除了由于某种原因它似乎没有从我的子进程中获取正确的退出状态 不起作用的代码
  • create-react-app + Nodejs (express) 服务器

    我在我的应用程序中使用 NodeJs React 我在 NodeJs 中使用express 我使用 create react app npm 创建了示例应用程序 我使用 NodeJs 从 React 应用程序调用 oauth 令牌 我在这篇
  • 自删除bash脚本

    bash 脚本如何在遇到删除自身的语句后执行 例如 当我运行 test sh 脚本时 其中包含 lt some commands gt rm test sh lt some more commands gt end 脚本执行到最后才删除自身
  • 检查 mysql_query 是否返回任何结果的最佳方法?

    我正在寻找最好的方法来检查查询中是否返回了任何结果 我感觉这部分代码我写了很多次 有时会出错 有时则不会 例如 我运行此查询来检查用户名是否存在 然后再将新用户名插入数据库 result mysql query SELECT FROM 然后
  • 对矩阵中的列重新排序

    假设我有一个n row m列矩阵A 我想重新排序每一列m根据某些特定行的排序 例如 如果我采取order A k 这给了我列中元素的数字或字母顺序k 我现在想对矩阵中的每一列进行排序A根据这些排名 使元素1 n每行都按顺序对应于元素1 n
  • Mailchimp API /列出 merge_fields 的日期类型参数格式

    我有一个date我需要在 Mailchimp API 的 v3 版本中填充该 merge field 在我找到答案之前 我在谷歌上进行了很多搜索 希望这可以节省某人的时间 预期的格式是 mm dd yyyy 看起来月份和日期的个位数就可以了
  • 仅跟踪嵌套 div 标签中悬停子元素的鼠标移动

    我有一个可以有 n 个嵌套 div 标签的环境 我必须仅在子 div 中跟踪鼠标的鼠标移动时刻 我有以下代码 结果显示在列表中 Problem 如果我附加更多子 div 鼠标移动也会跟踪所有父级 div 我想要的是 仅获取鼠标悬停区域的鼠标
  • 如何将日期构建附加到 gradle 上的 versionNameSuffix

    我正在使用 Android Studio 我需要在后面附加一个后缀versionNameSuffix在我的安卓设备上构建 gradle文件 我有三种不同的构建类型 我只需将日期时间附加到我的 测试版 版本中 我的实际文件是 defaultC
  • 为什么空格会影响 ruby​​ 函数调用?

    我收到此代码的语法错误 render json what gt created whatCreated gt thing htmlOutput gt render to string partial some partial 但使用这段代码
  • 使用 Yfinance 获取市值数据

    我试图使用 yfinance 获取股票的市值数据 这是我的代码 import yfinance as yf import numpy as np from pandas datareader import data import panda
  • 无法执行 HTTP 请求:Flink 中等待来自池的连接超时

    我正在研究一个将一些文件上传到 s3 存储桶的应用程序稍后 它从 s3 存储桶读取文件并将其推送到我的数据库 我在用着弗林克1 4 2 and fs s3a API用于从 s3 存储桶读取和写入文件 将文件上传到 s3 存储桶工作正常 没有
  • Jquery 表单插件还是 Jquery 序列化?

    我想知道有什么优点jQuery 表单插件 http jquery malsup com form getting started已经结束了序列化 http api jquery com serializeArray 如果我选择使用表单插件
  • jquery datepicker突出显示假期

    我正在尝试制作一个 jquery 日期选择器日历 它会突出显示假期 并在日期选择器上的日期悬停时将假期名称作为工具提示 假期日期来自 php 文件 holidays php 我的问题是 我似乎无法突出显示所有假期 它只突出显示一个日期 更具
  • 动画旋转 UIImageView

    我想旋转一个UIImageView左 右大约 10 度 但有一个平滑的动画 而不是我看到的突然转向 player transform CGAffineTransformMakeRotation angle UIView beginAnima
  • 如何在 IntelliJ IDEA 中多次运行同一个项目?

    我正在使用 IntelliJ IDEA 开发应用程序的客户端 为了调试我需要运行多个客户端 我想使用 IntelliJ IDEA 不可能在不同的窗口中运行相同的项目 那么如何运行多个客户端进行调试呢 You can 运行或调试 https
  • 如何在 php 中使用 C modf 函数?

    好像没有一个吧 使用 PHP 的fmod http php net manual en function fmod php
  • Redis 中的 AOF 和 RDB 备份

    这个问题是关于Redis持久化的 我使用 Redis 作为社交网站的 快速后端 这是设置的单个服务器 我一直在稳步地将 PostgreSQL 的职责转移到 Redis 目前在etc redis redis conf 追加设置设置为appen
  • SoundCloud,通过 api 下载或流式传输文件

    我尝试使用 download url 从 soundcloud 获取文件 我收到 重定向 或 401 未经授权 如何将其下载 流式传输到客户端 thanks 如果您收到 401 响应 那么您应该包括您的client id在请求中 它也可能是
  • 将文本文件嵌入到可以使用 fopen 访问的 exe 中

    我想将包含一些数据的文本文件嵌入到我的程序中 我们称之为 data txt 该文本文件通常加载一个函数 该函数需要文本文件的文件名作为输入 并最终使用 fopen 调用打开 FILE name fopen data txt 我无法真正更改此