使用独立的C ++应用程序存储数据

时间:2010-05-22 15:56:17

标签: c++ recommendation-engine data-storage

我使用Apache,PHP和MySQL进行Web开发和本地应用程序。在过去的几年里,我慢慢学习C ++,并希望在今年夏天建立一个应用程序。具体来说,我想创建一个“库”应用程序,在其中我可以存储有关我拥有的书籍,CD和记录的信息。我知道这种类型的应用程序存在,但我想学习C ++,这似乎是一个很好的方法。

以下是几个问题:

  
      
  1. 是否可以创建一个不需要数据库来存储数据的独立应用程序?

  2.   
  3. 如果上面#1的答案是“是”,那么为可能需要管理大量数据的应用程序执行此操作是否是个好主意?

  4.   
  5. 您建议将哪些数据存储选项用于C ++应用程序?

  6.   

谢谢!

更新的 嗯,这有很多好的答案。这是一个很棒的网站,有这么多的贡献者。事实证明,我现在可能不需要去C ++路线。我现在意识到我最感兴趣的是编写一个可以作为“库”组织系统 more 的应用程序而不是我想要追求C ++。感谢大家的回答!

6 个答案:

答案 0 :(得分:6)

  

是否可以创建一个不需要数据库来存储数据的独立应用程序?

是的,您可以使用某种自定义文件格式来存储数据。

  

如果对上面#1的答案为“是”,那么为可能需要管理大量数据的应用程序执行此操作是否是个好主意?

这不是一个好主意,除非你真的想学习在结构化文件中存储数据。

  

您建议将哪些数据存储选项用于C ++应用程序?

我会看SQLite。它是一个数据库,但它不需要单独的引擎。

答案 1 :(得分:1)

如果您不想使用数据库,则可能需要将数据保存到文件(或多个文件)。如果是这样,问题可能是:哪种文件格式最好?答案取决于各种因素:

1)快速访问,体积小,易于解析?答案是“二进制数据”。只需使用fwrite将数据直接写入输出文件即可。有两个缺点:文件不是人类可读的,维护不同版本很麻烦。如果您阅读的数据并不完全符合您的预期,那么您很快就会遇到麻烦。

2)人类可读且易于维护?这就是XML的用途。现在可以使用像tinyXML这样的解析器,它们是将数据写入文件的绝佳工具。缺点是编写加载/保存例程需要更多时间(很多情况下很多)。

3)为您完成工作的图书馆。 MFC提供了CArchive类,但是还有其他可能更好的工具可以做到这一点。

答案 2 :(得分:1)

  1. 它可以,但除非您的需求比它们看起来更专业,否则通用数据库管理器可能是更好的方法。
  2. 对于这样的事情,我想到使用可用的(许多)可嵌入数据库管理器之一。
  3. 鉴于你(显然)主要是为了自我教育而不是真正使用它,可能在没有数据库管理器的情况下编写代码来处理存储是有意义的。自己编写所有代码(稍加注意)通常会导致稍高的速度,但需要花费相当多的额外工作并且通常会失去灵活性。从学习的角度来看,最大的问题是你所学到的相当多的东西只会在相当狭窄的情况下应用(例如,对于大多数典型的应用程序,你想要使用数据库管理器,所以在没有很少收获的情况下学会做。)

    有点还取决于您的预期用途/观众。如果您希望一次支持多个用户,那么事情几乎立即就会变得更加困难(至少这样做有效)。如果您只对一个能够一次访问数据库的用户感兴趣,那么事情就会变得更加简单。

答案 3 :(得分:1)

  1. 这取决于数据,“大量数据”是相对的,您可能会发现有关1000本书的信息可以存储在几个MB中,那么将它存储在数据库中会有些过分,除非它是轻量级的DB如sqlite
  2. 我建议您使用纯文本格式,例如CSVXML
  3. 为了学习,除了你想学习SQL和关系数据库设计之外,它不会帮助你使用数据库引擎。 另一方面,使用数据库引擎将使开发更快更容易,因为它将为不同的数据创建索引,以帮助您轻松有效地进行搜索。

    所以这取决于你。

答案 4 :(得分:1)

嗯...

当然,你可以这样做。

您正在谈论的是回到RDBMS成功之前的时间段。这并不难,但你可能会学到一些经验教训:

  1. 在开始编码之前 - 或者至少在编写数据访问代码之前,进行数据库设计就好像要使用数据库一样 - 您需要哪些数据?你能减少你需要的属性(“字段”)的数量吗?您图书馆媒体类型的共性是什么?等
  2. 考虑将目录树和文件名用作ad-hoc存储结构的一部分。如果您需要或想要管理超出程序当前能力的数据,这将把数据直接交给命令行实用程序。例如,图书可能都在books子目录中,在其中,您可以使用ISBN或title作为文件名。我会查找使用ls,dir或CLI使用的任何文件名自然排序的内容。
  3. 另一个不错的选择是将其置于XML格式中。可能两者 - 使用目录层次结构进行整体数据布局,并将库条目数据放在XML格式的平面文件中。这在某些方面可能会变得很方便。
  4. 将数据仅以纯文本格式显示为字符串 - 无二进制数据!同样重要的是,能够访问/操作程序外的数据。
  5. 有了这样的策略,你可以使用像grep,sed,lex等系统工具,在需要的时候用数据做完全无计划的事情。
  6. 拥有一个功能 - 或编写一个单独的阅读器程序 - 遍历您的“数据库”并以纯文本形式输出其全部内容,每个条目一行。您可能有选项可以告诉它输出什么类型的媒体等。另外,包含一个标志,允许您设置输出的属性之间使用的分隔符 - 逗号分隔是一种常见的选择,但您可能只想要一个空格, carrage return,new line,或者其他任何东西。如果你让它成为一个可选的标志,让用户使用任何并提供你最喜欢的默认值,那就应该没问题了。
  7. 模块化您的代码,以便您可以在以后更换存储策略,如果您愿意,而不必重新破解整个程序。您甚至可以提供多种存储策略。
  8. 应该这样做。

    请注意,使用现代计算机硬件管理的数据量不太可能成为性能或空间问题,因此不必担心节省几个字节 - 这不值得麻烦。

    祝你好运,享受骑行。

答案 5 :(得分:0)

我还建议SQLite

从他们的网页:

“SQLite是一个软件库,它实现了一个独立的,无服务器,零配置的事务SQL数据库引擎.SQLite是世界上部署最广泛的SQL数据库引擎.SQLite的源代码在公共领域。“

“认为SQLite不是Oracle的替代品,而是替代fopen()”