c++11 - 将数据保存在.exe文件中

标签 c++11 exe

有没有一种方法可以创建一个控制台应用程序来询问输入数据(例如,用户的出生日期,最喜欢的食物,一切),并且我对其进行编程以使其在关闭时将这些数据存储在该.exe中?

这样,当我再次打开它时,所有这些数据仍将保存在此处,因此我只需要更新或修改它们。

最佳答案

不要将数据保存在您的executable内部,但要保存在外部


有没有办法创建一个程序,要求输入数据,然后在我关闭该.exe时将这些数据保存在该.exe中?


没有简单的方法(但是您不需要)。您想要的与persistenceapplication checkpointing有关。

实际上,您可能希望将数据存储在文件中,而不是在可执行文件中(可能使用诸如JSON之类的文本格式)或某些database(可能与诸如sqlite一样简单,或者与某些RDBMS进行交互)中存储数据。 >如PostGreSQL)。对于诸如生日和食物偏爱之类的事情,sqlite数据库文件可能是一个好方法(请参见一些SQLite tutorial)。努力设计database schema的优良设计。


这样,当我再次打开它时,所有这些数据仍将保存在那里


如果将这些数据保存在某个外部文件中(也许是一个简单的myappdata.sqlite文件),这些数据将仍然存在。您可以轻松地设计程序来创建该文件(如果该文件不存在)(这仅在您第一次运行程序时发生;在下次运行时,您的程序将在启动时从该外部文件中成功读取该数据)。

在大多数最新的operating systems(请阅读this textbook以了解有关操作系统的更多信息)中,尤其是Windows,MacOSX,Linux,Android等,executable应该是只读的。并且它可能同时在多个processes中运行(在这种情况下,应该发生什么事情?请考虑ACID属性)。

通常的做法是将数据存储在可执行文件之外(大多数程序,包括文本处理器,编译器,Web浏览器,正在执行此操作)。您无需解释为什么要在可执行文件中存储一些数据,而这样做是不寻常的,并且是高度特定于操作系统和特定于可执行文件格式的(对于Linux,请仔细研究elf(5) ...)

我建议将数据保存在一些可选文件(或数据库)中-它的文件路径可能有一些有线常量默认值,等等...。在启动时,您检查该数据是否存在(例如,在POSIX上使用access(2) ,或者仅通过处理fopensqlite3_open等的失败案例。)。如果不存在,则以某种方式初始化程序数据。在退出时(或节省时间),您可以写入该数据。顺便说一句,大多数程序都在这样做。

请注意,在大多数操作系统和计算机上,软件不仅是单个可执行文件,而且还有更多(例如,所需的库和依赖项,配置文件,数据文件,build automation脚本,例如Makefile等)。 。它的installation是一个公认的技术过程(有时相当复杂),而package managers很有帮助。

我的感觉是,没有特定的动机,您甚至不应该尝试(持久地)在可执行文件中存储(可变)数据(这是复杂的,易碎的,因为非常依赖于OS和编译器以及构建链,这很不寻常,并且打开vulnerabilities) 。

为了完整起见,某些程序实际上是通过重写其可执行文件来写入一些数据的。在Linux上,GNU emacs在其unexec.c文件中(实际上非​​常脆弱,因为特定于OS和编译器)在实际中仅在disputed文件中这样做,但是该功能为SBCL并且可能会消失。

许多其他系统巧妙地处理了正交持久性:save-lisp-and-die具有一些Poly/ML原语(通常将状态保存在其他“图像”文件中)。 export facility有一些this paper。 J.Pitrat的CAIA系统(请参见his blogtarball of CAIA;可在my主页上获得2016年的FullPliant-拥有许可-)能够完全重新生成其所有C代码和所有必需的数据(以数千为单位)文件)。 GC handbook将其状态保存在组织良好的文件树中。这样的持久性或检查点技术与垃圾收集相关(因此您应该阅读bismon),并且正在使用接近复制垃圾收集的技术和算法。

FWIW,我当前的项目homoiconic,正在正交保留其整个堆,但是在主可执行文件之外执行此操作(在理想情况下,我想重新生成它的所有C或C ++源代码;我是远没有达到目标)。

我的建议是将软件保存在多个文件中:可执行文件,与之相关的C ++源代码,数据文件(以及可能更多的依赖项,即共享库或DLL,字体和图像文件,所需的二进制文件等)。 )。这样,在保持状态时,您无需覆盖可执行文件。由于您提到C ++(不是Quine),因此可以使用其持久性数据生成系统的C ++代码(然后称为free software程序)(并将所有生成的C ++的重新编译留给系统的C ++编译器) )。我还建议将自生成程序设置为XBM。 (如果您这样做的话,最好将问题编辑为给出其URL)。

在C ++中,您可以通过以下方式将数据保留在可执行文件中(同样,这是一个坏主意,我希望说服您避免这种方法):添加一个C或C ++源文件(例如mydata.cc )(仅包含数据(例如一些大的const char data[]="... many lines of data ...";))-顺便说一句,object files文件格式可能很受启发。您将所有其他*.o std::system保留在程序已知的位置。要保存数据,请在每次保存操作时重新生成该mydata.cc文件(使用当前状态的新数据),最后运行适当的命令(也许在代码中使用)来编译该mydata.cc并将其与保存的*.o链接到一个新的可执行文件中。因此,每个保存操作都需要重新编译data.cc及其与其他*.o对象文件的链接(当然,C ++编译器和链接器,可能还有其他的构建自动化工具,会成为程序的必需依赖项)。这样的方法并不比保留外部数据文件简单(并且需要保留这些*.o对象文件)。


这样,当我再次打开它时,所有这些数据仍将保存在那里


如果您的目标只是获取过去写入的数据,则只需将数据保存在一些可选的数据库或文件中(就像许多程序一样:您的文字处理器会要求您先保存其文档,然后再退出,而无需任何文件并在可执行文件之外写一些单词),然后在退出程序之前将其写入。无需覆盖您的可执行文件!

关于c++11 - 将数据保存在.exe文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52026886/

相关文章:

c++ - 应如何使用 C++11 Regex 从存储在文本文件中的表创建变量?

python - Py2Exe 没有这样的文件或目录错误

c#,从可执行文件外部的参数打开特定的 Windows 窗体

c# - exe 需要 .NET 桌面运行时

java - launch4j 中的 .exe 有效,但不适用于所有计算机

c++ - 如果删除了复制赋值运算符,为什么 MSVC 12.0 会忽略私有(private)构造函数?

c++替换调用对象方法的宏函数

c++ - unique_ptr - 无效指针和段错误

c++ - 如何在 C++11 中打印当前时间?

python - 在 Windows 上运行 Python 脚本 (Tkinter)