如何使用C程序永久存储信息?
How to permanently store information using C program?
我正在尝试从用户那里获取输入,让程序在每次运行时都能记住。我想用C来做这个。基于我对计算机的有限了解,这将存储在storage/hard drive/ssd而不是RAM/memory中。我知道我可以使用数据库或写入文本文件,但我不想使用外部文件或数据库,因为我认为数据库对此有点矫枉过正,外部文件可能会被弄乱由用户。我该怎么做(让用户输入一次并让程序永远记住它)?谢谢! (如果有人需要我澄清我的问题,我很乐意这样做,当我得到答案时,我会为未来的用户澄清这个问题。)
如果用户确实想要修改文件,您将无法阻止他们。您可以做的是创建一个文件,其名称或扩展名明确表明不应修改该文件,或者使其对用户隐藏。
如果要持久化数据,典型的方法是将其存储到文件中。只需使用 FILE* 即可开展您的业务。
为此使用数据库可能有点矫枉过正,这取决于您以后希望如何在存储数据后访问数据。
如果您只是从文件中加载数据并通过它进行搜索,那么就不需要数据库,如果您有大量数据并且想要进行复杂的搜索,那么数据库就是最佳选择。如果您需要冗余、用户处理、安全性,那么请选择一个数据库,因为每个数据库的开发人员都已经花了很多时间来解决这个问题。
实际上没有任何通用的方法可以写入文件并同时阻止用户访问它。您需要 OS/platform 级别的支持才能拥有某种受保护的存储。
唯一真正常用的替代方法是将信息在线存储在您控制的服务器上,然后通过网络从那里获取信息。您可以缓存一个带有到期日期的加密签名本地副本,以避免每次程序 运行 时都必须连接。当然,如果您这样做是为了某种 DRM 或类似措施(例如,限时演示),您还需要保护您的软件免遭修改。
(请注意,您在评论中提到的修改程序本身与修改其他文件并没有什么不同。特别是,用户可以从备份或重新下载来恢复程序的早期版本它,即使是普通用户也可能会尝试。另外,软件上的任何签名都会因您的修改而失效,并且可能会触发杀毒软件。)
如果您只是想将您的文件隐藏在某处以防止临时用户(仅),请给它一个模糊的名称并使用文件系统属性和命名将文件设置为隐藏(在 *nix 系统中带有 .
作为文件名的第一个字符)。 (根据 OS,权限 and/or 沙盒可能会阻碍您将其隐藏到何种程度。)
另请注意,如果您的目标是对用户隐藏信息,则应以某种方式对其进行加密。这包括作为写入它的程序的一部分的任何数据。
编辑:万一我猜错了,想这样做的原因只是为了保留东西"clean",那么就把它存储在平台通常的"user settings"区。例如,Windows 上的 AppData 或注册表,macOS 上的用户默认值或 ~/Library/Application Support
,通用 *nix 系统上的 "dotfile",等等。不要修改应用程序本身这个原因。
人们以各种方式做到了这一点。从最好到最差的顺序(我认为):
- 使用 registry 或等效项。这就是它的用途。
- 使用 environment variable。 IMO 这是容易出错的,可能不是你想要的。
- 在您用户的计算机上存储一个文件。简单易行。
- 在服务器上存储一个文件,通过网络read/write到服务器。烦人的是必须要用网络,不过还行。
- 修改磁盘上您自己的二进制文件。这作为一种学习体验很有趣,但在生产代码中通常是不可取的。有时仍然可以完成,尤其是使用安装程序。
- 生成一个 "never" 终止的后台进程。这比使用文件更糟糕。
我正在尝试从用户那里获取输入,让程序在每次运行时都能记住。我想用C来做这个。基于我对计算机的有限了解,这将存储在storage/hard drive/ssd而不是RAM/memory中。我知道我可以使用数据库或写入文本文件,但我不想使用外部文件或数据库,因为我认为数据库对此有点矫枉过正,外部文件可能会被弄乱由用户。我该怎么做(让用户输入一次并让程序永远记住它)?谢谢! (如果有人需要我澄清我的问题,我很乐意这样做,当我得到答案时,我会为未来的用户澄清这个问题。)
如果用户确实想要修改文件,您将无法阻止他们。您可以做的是创建一个文件,其名称或扩展名明确表明不应修改该文件,或者使其对用户隐藏。
如果要持久化数据,典型的方法是将其存储到文件中。只需使用 FILE* 即可开展您的业务。
为此使用数据库可能有点矫枉过正,这取决于您以后希望如何在存储数据后访问数据。
如果您只是从文件中加载数据并通过它进行搜索,那么就不需要数据库,如果您有大量数据并且想要进行复杂的搜索,那么数据库就是最佳选择。如果您需要冗余、用户处理、安全性,那么请选择一个数据库,因为每个数据库的开发人员都已经花了很多时间来解决这个问题。
实际上没有任何通用的方法可以写入文件并同时阻止用户访问它。您需要 OS/platform 级别的支持才能拥有某种受保护的存储。
唯一真正常用的替代方法是将信息在线存储在您控制的服务器上,然后通过网络从那里获取信息。您可以缓存一个带有到期日期的加密签名本地副本,以避免每次程序 运行 时都必须连接。当然,如果您这样做是为了某种 DRM 或类似措施(例如,限时演示),您还需要保护您的软件免遭修改。
(请注意,您在评论中提到的修改程序本身与修改其他文件并没有什么不同。特别是,用户可以从备份或重新下载来恢复程序的早期版本它,即使是普通用户也可能会尝试。另外,软件上的任何签名都会因您的修改而失效,并且可能会触发杀毒软件。)
如果您只是想将您的文件隐藏在某处以防止临时用户(仅),请给它一个模糊的名称并使用文件系统属性和命名将文件设置为隐藏(在 *nix 系统中带有 .
作为文件名的第一个字符)。 (根据 OS,权限 and/or 沙盒可能会阻碍您将其隐藏到何种程度。)
另请注意,如果您的目标是对用户隐藏信息,则应以某种方式对其进行加密。这包括作为写入它的程序的一部分的任何数据。
编辑:万一我猜错了,想这样做的原因只是为了保留东西"clean",那么就把它存储在平台通常的"user settings"区。例如,Windows 上的 AppData 或注册表,macOS 上的用户默认值或 ~/Library/Application Support
,通用 *nix 系统上的 "dotfile",等等。不要修改应用程序本身这个原因。
人们以各种方式做到了这一点。从最好到最差的顺序(我认为):
- 使用 registry 或等效项。这就是它的用途。
- 使用 environment variable。 IMO 这是容易出错的,可能不是你想要的。
- 在您用户的计算机上存储一个文件。简单易行。
- 在服务器上存储一个文件,通过网络read/write到服务器。烦人的是必须要用网络,不过还行。
- 修改磁盘上您自己的二进制文件。这作为一种学习体验很有趣,但在生产代码中通常是不可取的。有时仍然可以完成,尤其是使用安装程序。
- 生成一个 "never" 终止的后台进程。这比使用文件更糟糕。